本文主要介绍图像处理中的滤波和阈值(这是未处理的图像,可观察到有很多的小白点,这里称为噪音点,滤波操作正是解决这些噪声点
一、均值滤波(简单的平均卷积操作)
在 OpenCV 中,cv2.blur() 函数用于对图像进行均值滤波操作。其第一个参数 img 是输入图像。第二个参数 (3,3) 是指定滤波器的大小为 3x3。
均值滤波器是一种线性滤波器,它用于去除图像中的噪声,同时平滑图像。具体而言,均值滤波器使用滤波器窗口内的像素值的平均值来代替中心像素值。
在本例中,(3,3) 参数表示滤波器的大小为 3x3。滤波器窗口的大小越大,平滑效果越明显,但同时可能会导致图像细节的丢失。因此,在选择滤波器大小时需要根据具体的应用需求进行调整。
总之,cv2.blur() 函数使用一个滤波器窗口对图像进行均值滤波,参数 (3,3) 指定了滤波器的大小。
blur =cv2.blur(img,(3,3))
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
经过均值滤波下的图像展示
二、方框滤波(基本与均值滤波一样,可以选择归一化)
在 OpenCV 中,cv2.boxFilter() 函数是用来对图像进行盒式滤波的操作,函数的第二个参数 -1 是指定输出图像的深度与输入图像保持一致。第三个参数 (3,3) 是指定滤波器的大小为 3x3。盒式滤波器是一种线性滤波器,它用一个固定的权重盒子(也称为卷积核)对图像进行滤波。在盒式滤波中,权重盒子中的每个元素都具有相同的权重。
而参数 normalize=True 表示对滤波器进行归一化处理,即将滤波器的所有权重元素除以它们的和。归一化可以确保滤波器的所有权重之和为 1,从而保持图像的亮度不变。这个参数在应用盒式滤波时很常见,但如果不需要归一化则可以设置为 False。
总之,cv2.boxFilter() 函数是用来对图像进行盒式滤波的操作,可以通过设置滤波器大小和是否进行归一化来调整滤波效果。
box = cv2.boxFilter(img,-1,(3,3),normalize=True)
cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destroyAllWindows()
box = cv2.boxFilter(img,-1,(3,3),normalize=False)
cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destroyAllWindows()
方框滤波不作归一化,效果与均值滤波一样
方框滤波作归一化,出现越界情况
三、高斯滤波(高斯滤波的卷积核的数值是满足高斯分布的,相当于更重视中间的
在 OpenCV 中,cv2.GaussianBlur() 函数是用来对图像进行高斯模糊的操作,函数的第二个参数 (5,5) 是指定高斯核的大小为 5x5。而第三个参数 1 是指定高斯分布函数的标准差(也称为方差)为 1。标准差越大,高斯核分布越平坦。此处的标准差为1,表示高斯核分布相对尖锐。在进行高斯模糊时,尖锐的高斯核能够更好地平滑图像。
aussian = cv2.GaussianBlur(img,(5,5),1)
cv2.imshow('aussian',aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、中值滤波(相当于用中值代替)
中值滤波:cv2.medianBlur(img,5)
在 OpenCV 中,cv2.medianBlur() 函数是用来对图像进行中值滤波的操作,函数的第二个参数 5 是指定滤波器的大小为 5x5。中值滤波是一种非线性滤波器,它将像素值替换为邻域中像素值的中值。与高斯滤波器不同,中值滤波器不会平滑图像的细节部分,因此能够在保留图像边缘和细节的同时去除噪声。在中值滤波时,滤波器大小越大,可以去除的噪声也就越多,但同时也会导致图像的细节丧失。因此,一般需要具体问题具体分析,在选择滤波器大小时需要进行适当的平衡考虑。
median = cv2.medianBlur(img,5)
cv2.imshow('median',median)
cv2.waitKey(0)
cv2.destroyAllWindows()
五、图像阈值
图像阈值是一种基本的图像处理技术,用于将图像分割成不同的区域或者二值化图像。阈值处理根据像素的亮度或者颜色值与设定的阈值进行比较,将像素分为两个类别(如黑白、前景背景、高低亮度等)。
常见的图像阈值处理方法有以下几种:
1. 全局阈值:选择一个全局固定的阈值,将图像中所有像素与该阈值进行比较。大于阈值的像素设为一个类别,小于阈值的像素设为另一个类别。
2. 自适应阈值:根据图像的局部区域自动调整阈值。常见的自适应阈值方法有局部平均值、局部高斯加权平均值等。
3. Otsu's 阈值:基于最大类间方差,将图像分割成两个类别,使得类别内的方差最小,类别间的方差最大。Otsu's 阈值自动选择合适的分割阈值。
4. 使用颜色通道阈值:对于彩色图像,可以通过将图像从 RGB 或者 HSV 等颜色空间转换到单一通道,然后使用单通道上的阈值处理。
图像阈值处理可以用于目标检测、边缘提取、分割以及图像二值化等应用。具体使用哪种阈值处理方法,需要根据具体的图像特点和应用需求来决定。
src:输入图,只能是单通道图,通常来说为灰度图
dist:输出图
thresh:阈值
maxval:当像素点超过了阈值(或者小于阈值,根据type决定,所赋予的值
type:二值化操作的类型,包含(cv2
cv2.THRESH_BINARY:超过阈值的部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INV:上者的反转
cv2.THRESH_TRUNC:大于阈值的部分设为阈值,否则不变
cv2.THRESH_TOZERO:大于阈值的部分不改变,否则设为0
cv2.THRESH_TOZERO_INV:上者的反转
import matplotlib.pyplot as plt
gray_img = cv2.imread('gray_dog.png')
ret,thresh1=cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(gray_img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(gray_img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(gray_img,127,255,cv2.THRESH_TOZERO_INV)
titles =['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [gray_img,thresh1,thresh2,thresh3,thresh4,thresh5]
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()