OpenCV学习记录(二 图像去噪、四种滤波方式)
图像去噪使用OpenCV对图像进行处理,考虑对图像进行去除噪声点,通过不同方法。
OpenCV对于图像去噪(又称图像平滑)提供了四种方法,分别是均值滤波、方框滤波、中值滤波和高斯滤波。
图片去噪处理一般是在图像灰度化之后,图像灰度化之后,会存在噪声点,这些噪声点不是我们所需要的,需要图像去噪技术。
要想去除图片的噪声,需要一张有噪声的图片,下面代码为图片添加噪声
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
img = cv2.imread("yiyuan.jpg")
h, = img.shape[0:2]
#去噪声
for i in range(3000): #添加3000个噪声点
x=np.random.randint(0, h) #生成随机数,随机行
y=np.random.randint(0, ) #生成随机数,随机列
img[x,y,:]=255 #255为白色,生成白色噪声点
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imsho(img)
plt.axis('off')
plt.savefig("yi.jpg")
plt.sho()
效果图如下
一、均值滤波定义均值滤波是指任意一点的像素值,都是周围NM个像素值的均值。
均值滤波函数
import cv2
import numpy as np
def junzhi(img,size): #img输入,size均值滤波器的尺寸,>=3,且必须为奇数
num = int((size - 1) / 2) # 输入图像需要填充的尺寸
img = cv2.copyMakeBorder(img, num, num, num, num, cv2.BORDER_REPLICATE) #对传入的图像进行扩充,尺寸为num
h1, 1 = img.shape[0:2]
# 高斯滤波
img1 = np.zeros((h1, 1, 3), dtype="uint8") #定义空白图像,用于输出中值滤波后的结果
for i in range(num, h1-num): #对扩充图像中的原图进行遍历
for j in range(num, 1-num):
sum=0
sum1=0
sum2=0
for k in range(i-num,i+num+1): #求中心像素周围sizesize区域内的像素的平均值
for l in range(j-num,j+num+1):
sum=sum+img[k,l][0]
sum1=sum1+img[k,l][1]
sum2=sum2+img[k,l][2]
sum=sum/(size2) #除以核尺寸的平方
sum1 = sum1/(size2)
sum2 = sum2/(size2)
img1[i, j]=[sum,sum1,sum2] #复制给空白图像
img1=img1[(0+num):(h1-num),(0+num):(h1-num)] #从滤波图像中裁剪出原图像
return img1
img=cv2.imread("yiyuan.jpg")
h, = img.shape[0:2]
#加噪声
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, )
img[x,y,:] = 255
#调用均值滤波函数
result=junzhi(img,5) #传入读取的图像和核尺寸
cv2.imsho("zaosheng",img)
cv2.imsho("junzhi",result)
cv2.aitKey(0)
效果如图
OpenCV中均值滤波函数库函数的使用
函数cv2.blur(img,(size,size1))
img需要处理的图像
(size,size1)表示核大小,是以(宽度,高度)表示的元祖形式。
使用库函数进行均值滤波图像处理,效果如下
代码如下
import cv2
import numpy as np
img=cv2.imread("yiyuan.jpg")
h, = img.shape[0:2]
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, )
img[x,y,:] = 255
#调用均值滤波函数
result=cv2.blur(img,(5,5)) #传入读取的图像和核尺寸
cv2.imsho("Noise",img)
cv2.imsho("junzhi",result)
cv2.aitKey(0)
原理方框滤波与均值滤波原理相同,是指任意一点的像素值,都是周围NM个像素值的均值。方框滤波需要均一化处理,如果不做均一化处理,容易产生溢出,溢出的像素值为255,即为白色。均一化处理的参数为布尔型变量normalize,当normalize=Ture时,表示需要均一化处理,normalize=Flase时,不需要均一化处理。
数学原理
函数原型result=cv2.boxFilter(img,deep,(size,size1),normalize)
#img原始图像,需要进行处理的图片
#deep原始图像深度
#(size,size1)核尺寸
#normalize归一化参数,normalize=1进行归一化处理,normalize=0不进行归一化处理。
使用方框滤波库函数处理图像
代码如下
import cv2
import numpy as np
img=cv2.imread("jiesi.jpg")
h, = img.shape[0:2]
#加噪声
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, )
img[x,y,:] = 255
#调用均值滤波函数
result=cv2.boxFilter(img, -1, (5,5), normalize=1)
result1=cv2.boxFilter(img, -1, (5,5), normalize=0)
cv2.imsho("jia zao yuan hua",img)
cv2.imsho("jun yi-opencv",result)
cv2.imsho("bu jun yi-opencv",result1)
cv2.aitKey(0)
效果图如下
三、中值滤波原理选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。
换成图像模板来理解就是将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。
函数原型result=cv2.medianBlur(img,size)
#img需要进行中值滤波处理的图像
#size核大小,必须是大于1的奇数。
中值滤波库函数的使用
代码如下
import cv2
import numpy as np
img=cv2.imread("yiyuan.jpg")
h, = img.shape[0:2]
for i in range(3000): #添加3000个噪声点
x = np.random.randint(0, h)
y = np.random.randint(0, )
img[x,y,:] = 255
#调用OpenCV库函数中的均值滤波函数
result=cv2.medianBlur(img, 5) #核尺寸是大于1的奇数
cv2.imsho("yuan tu",img)
cv2.imsho("zhong zhi-opencv",result)
cv2.aitKey(0)
效果图如下
四、高斯滤波原理高斯平滑也是邻域平均的思想对图像进行平滑的一种方式,在图像高斯平滑中,不同位置的像素被赋予了不同的权重。
高斯函数
OpenCV中高斯滤波库函数的使用
函数原型result=cv2.GaussianBlur(img,(size,size1),sigmaX,sigmaY)
#img需要处理的图像
#(size,size1)高斯核尺寸
#sigmaXX方向上的高斯核标准偏差
#sigmaYY方向上的高斯核标准偏差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigma都为零,则分别从ksize.idth和ksize.height计算得出;为了完全控制结果,建议指定所有ksize,sigmaX和sigmaY。核大小(size,size)必须是奇数,X方向方差主要控制权重。
OpenCV高斯滤波库函数的使用
代码如下
import cv2 import numpy as np img=cv2.imread("jiesi.jpg") h, = img.shape[0:2] for i in range(3000): #添加3000个噪声点 x = np.random.randint(0, h) y = np.random.randint(0, ) img[x,y,:] = 255 #调用OpenCV库函数中的高斯滤波函数 result=cv2.GaussianBlur(img,(5,5),1,1) #传入读取的图像和核尺寸 (5,5)必须是奇数 cv2.imsho("yuantu",img) cv2.imsho("gaosi-opencv",result) cv2.aitKey(0)
图像效果如下
高斯滤波实质上是一种信号的滤波器,大多数图像使用高斯滤波器会得到信噪比SNR较高的图像(反应真实信号)。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。