文章目录
- OpenCV
- 图像平滑处理
- 1. 添加噪声
- 2. 均值滤波
- 3. 方框滤波
- 4. 高斯滤波
- 5. 中值滤波
- 图像形态学
- 1. 腐蚀
- 2. 膨胀
- 3. 开运算
- 4. 闭运算
- 5. 梯度运算
- 6. 顶帽和黑帽
- 顶帽
- 黑帽
- 总结
OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。
本篇所用图片数据:
链接:https://pan.baidu.com/s/1-C6sxtw-S3vL1I5SwaStlQ?pwd=dzvx
提取码:dzvx
图像平滑处理
1. 添加噪声
添加噪声与给图片打码有相似之处,即在一张图片随机改变几个点的像素值:
#自添加噪声
def add_noise(image,n = 1000):
result = image.copy()
w,h = image.shape[:2] #高 宽 高轴为y轴,宽轴为x轴
for i in range(n):
x = np.random.randint(1,h) #随机定位图片范围内的坐标点
y = np.random.randint(1,w)
#在0,1中随机抽一个数判断,要么白点要么黑点
if np.random.randint(0,2) == 0:
result[x,y] = 0
else:
result[x,y] = 255
return result
a = cv2.imread('yifei.jpg')
image = cv2.resize(a,(400,400))
cv2.imshow('ori',image)
cv2.waitKey(0)
noise = add_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)
2. 均值滤波
在卷积核范围内,求像素点平均值,替换中心点的像素值值:
比如在上图中,一个3*3的卷积核,计算平均值替换中心点的值。
blur_1 = cv2.blur(noise,(3,3)) #(3,3):卷积核范围,3*3 ----> 卷积核一般为奇数范围,有中心位置替换
cv2.imshow('blur_1',blur_1)
cv2.waitKey(0)
blur_2 = cv2.blur(noise,(5,5))
cv2.imshow('blur_2',blur_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们可以发现,均值滤波对噪声点的处理不明显,效果较差。
3. 方框滤波
方框滤波:是指用当前像素点周围nxn个像素值的和来代替当前像素值。
参数:
方框滤波
boxFilter()中有参数:
ddepth:表示深度,-1表示与原始图像深度相同
normalize:表示图像是否要进行归一化。
1、True:归一化,用邻域像素值的和除以面积,此时与均值滤波效果相同
2、False:不归一化,直接使用邻域像素值的和,和>255时,使用255
boxFilter_1 = cv2.boxFilter(noise,-1,(3,3),normalize=True)
cv2.imshow('boxFilter_1',boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize=False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)
方框滤波的效果也不太行哦~,效果不是很理想。
4. 高斯滤波
高斯滤波(Mean filtering):对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
#高斯滤波
GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow('GaussianB',GaussianB)
cv2.waitKey(0)
效果不太行,有明显的像素点未处理,且图片模糊。
5. 中值滤波
中值滤波:会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。比如:
[0,48,56,95,128,130,212,215,250]选择的就是128。
#中值滤波
medianB = cv2.medianBlur(noise,5)
cv2.imshow('medianB',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们看到,图片效果处理非常好呀!!噪声点基本都处理掉了。
图像形态学
什么是形态学:图像形态学是一种处理图像形状特征的图像处理技术,主要用于描述和处理图像中的形状和结构。形态学可以用于提取图像中的特征、消除噪声、改变图像的形状等。
1. 腐蚀
图像形态学中的腐蚀是一种基本的图像处理技术,它基于数学形态学原理,通过特定的结构元素对图像进行卷积操作,从而减小图像中物体的大小或去除物体的边界点。
# 1.腐蚀:cv2.erode()
sun = cv2.imread('sun.png')
cv2.imshow('sunn',sun)
cv2.waitKey(0)
# kernel:用于腐蚀的结构原件,设置大小
# iterations:图像腐蚀的次数
kernel = np.ones((3,3),np.uint8)
erosion_1 = cv2.erode(sun,kernel,iterations=1)
cv2.imshow('fushi',erosion_1)
cv2.waitKey(0)
腐蚀的次数越多,图片边界点被腐蚀的越严重。
图中可以明显的看到:太阳发散的线条被去除掉了,这就是腐蚀的效果。
2. 膨胀
图像形态学中的膨胀是一种重要的图像处理技术,它基于数学形态学原理,通过特定的结构元素对图像进行卷积操作,从而扩大图像中物体的大小或增加物体的边界点。
# 2.膨胀:cv2.dilate()
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wz_ori',wenzi)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)
wenzi_new = cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow("pengzhang",wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们可以明显的看到,文字都膨胀加粗了,膨胀的效果比较明显。
3. 开运算
开运算:先腐蚀后膨胀 -- cv2.MORPH_OPEN()
# 开运算:先腐蚀后膨胀 -- cv2.MORPH_OPEN()
noise_zhiwen = cv2.imread('noise_zhiwen.png')
cv2.imshow('noise',noise_zhiwen)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)
k_zhiwen = cv2.morphologyEx(noise_zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('new_zhiwen',k_zhiwen)
cv2.waitKey(0)
对比两张图,可以发现图片先经过了腐蚀去除了噪声点,然后膨胀。
4. 闭运算
闭运算:先膨胀后腐蚀 -- cv2.MORPH_CLOSE()
#闭运算:先膨胀后腐蚀 -- cv2.MORPH_CLOSE()
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('zhiwen',zhiwen)
cv2.waitKey(0)
kernel = np.ones((5,5),np.uint8)
b_zhiwen = cv2.morphologyEx(zhiwen,cv2.MORPH_CLOSE,kernel)
cv2.imshow('b_zhiwen',b_zhiwen)
cv2.waitKey(0)
通过图片我们看见,闭运算后的指纹,断开出都连接在了一起。
5. 梯度运算
图像形态学中的梯度运算在边缘检测、轮廓提取、特征增强以及作为预处理步骤等方面发挥着重要作用。它不仅能够提高图像处理的效率和准确性,还能够为后续的图像分析和目标识别等任务提供有力的支持。
梯度运算:图像膨胀后减去图像腐蚀的结果 -- cv2.MORPH_GRADIENT()
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi',wenzi)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)
#膨胀
pz_wenzi = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('pz_wenzi',pz_wenzi)
cv2.waitKey(0)
#腐蚀
fs_wenzi = cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow('fs_wenzi',fs_wenzi)
cv2.waitKey(0)
#膨胀 - 腐蚀
bianyuan = cv2.morphologyEx(wenzi,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('bianyuan',bianyuan)
cv2.waitKey(0)
从最后结果可以发现,梯度运算将膨胀的结果减去腐蚀的结果,可以得到文字的外轮廓,对于边缘检测、轮廓提取有明显作用。
6. 顶帽和黑帽
顶帽
顶帽操作是原始图像与开运算结果之间的差值。开运算是先进行腐蚀操作,再进行膨胀操作的过程。由于腐蚀操作会缩小图像中的高亮区域,而膨胀操作会恢复部分但不一定全部的高亮区域,因此开运算的结果往往比原始图像更平滑,去除了部分小细节。顶帽操作通过计算原始图像与开运算结果之间的差异,将这些被去除的小细节重新显现出来。
图像形态学中的顶帽操作在提取图像中的小细节、增强图像对比度、背景提取与分离等方面具有显著作用。通过合理选择和调整参数以及与其他技术的结合使用,顶帽操作可以在多种图像处理任务中发挥重要作用。
顶帽:原始图像 - 开运算结果(先腐蚀后膨胀) -- cv2.MORPH_TOPHAT()
sun = cv2.imread('sun.png')
cv2.imshow('sun_yuantu',sun)
cv2.waitKey(0)
# 设置kernel大小
kernel = np.ones((2,2),np.uint8)
# 顶帽:原始图像 - 开运算结果(先腐蚀后膨胀)
# cv2.MORPH_TOPHAT()
tophat = cv2.morphologyEx(sun,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tophot',tophat)
cv2.waitKey(0)
黑帽
黑帽操作是闭运算结果与原始图像之间的差值。闭运算是先进行膨胀操作,再进行腐蚀操作的过程。由于膨胀操作会扩大图像中的高亮区域,而腐蚀操作会缩小这些区域,但不一定能完全恢复到原始状态,因此闭运算的结果往往比原始图像更平滑,填充了部分暗部细节。黑帽操作通过计算闭运算结果与原始图像之间的差异,将这些被填充的暗部细节重新显现出来。
图像形态学中的黑帽操作在突出图像中的暗部细节、增强图像对比度、背景与前景的分离等方面具有显著作用。通过合理选择和调整参数以及与其他技术的结合使用,黑帽操作可以在多种图像处理任务中发挥重要作用。
黑帽:闭运算(先膨胀后腐蚀) - 原始图像 -- cv2.MORPH_BLACKHAT
# 黑帽:闭运算(先膨胀后腐蚀) - 原始图像
# cv2.MORPH_BLACKHAT
blackhat = cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)
总结
本篇介绍了:
- 图像的平滑处理:包含均值滤波、方框滤波、高斯滤波以及中值滤波。
- 图像形态学:腐蚀、膨胀、开闭运算、梯度运算以及顶帽和黑帽