OpenCV + Python3
第七章 图像平滑处理
在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称之为对图像的平滑处理,所得的图像称为平滑图像。
图像平滑处理的基本原理是将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值,取近似值的方法有很多。
1.均值滤波cv2.blur(src, ksize)
取当前像素点周围N * N个像素点的均值来代替当前像素值
除此之外,还可以用来扩展当前图像的周围像素点。
在OpenCV中,均值滤波可以视作:
等式右侧被称为卷积核,其中M和N分别对应高度和宽度。一般情况下,M和N是相等的,如果M和N的值越大,参与运算的像素点数量就越多,图像失真越严重。
卷积核越大,去噪效果越好,当然花费的计算时间也就越长,同时会让图像失真越严重。在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核。
2.方框滤波cv2.boxFilter(src, ddepth, ksize)
与均值滤波不同的是,方框滤波不会计算像素值,在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和除以邻域面积。而在方框滤波中,可以自由选择滤波结果是邻域像素值之和的平均值还是邻域像素值之和。
Normalize = 0表示不取平均值
Normalize = 1(默认)表示取平均值,此时与均值滤波相同
3.高斯滤波cv2.GuassianBlur(src, ksize, 0, 0)
在进行均值滤波和方框滤波时,其邻域内每个像素点的权重是相等的,在高斯滤波中,会将中心点的权重加大,远离中心点的权重减小,在此基础上计算邻域内各个像素值不同权重的和。
在实际使用中,高斯滤波可能用的是不同大小的卷积核,在高斯滤波中,核的宽度和高度可以不相同,但是它们都必须是奇数,且每一种尺寸的卷积核都可以有多种不同形式的权重比例。
4.中值滤波cv2.medianBlur(src, ksize)
中值滤波不再采用加权平均值的方式来计算滤波结果,它用邻域内所有像素值的中间值来替代当前像素点的像素值。
ksize是滤波核的大小需要注意,核大小必须是比1大的奇数。
由于没有进行均值处理,中值滤波不存在均值滤波等滤波方式带来的细节模糊的问题。在中值滤波处理中,噪声成分很难被选中,所以可以在几乎不影响原有图像的情况下去除全部噪声。但是由于需要进行排序等操作,中值滤波需要的运算比较大。
5.双边滤波cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效的保护图像内的边缘信息。双边滤波在计算某一像素点的新值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)。双边滤波综合考虑距离和色彩的权重结果,既能够有效的去除噪声,又能够有效的保护边缘信息。
在双边滤波中,当处在边缘时,与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩相差较大的像素点(颜色距离很远)会被给予较小的权重值(极端情况下权重可能为0,直接忽略该点),这样就保护了边缘信息。
双边滤波的优势体现在对于边缘信息的处理上
6.2D卷积cv2.filter2D(src, ddepth, kernel)
OpenCV提供了多种滤波方式,我们有时希望使用特定的卷积核实现卷积操作
所以使用OpenCV的自定义卷积函数
kernel是卷积核,是一个单通道的数组,如果想要处理彩色图像,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作。
第八章 形态学操作
形态学,即数学形态学,是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。形态学处理在视觉检测,文字识别,医学图像处理,图像压缩编码等领域都有非常重要的应用。
形态学操作主要包含:腐蚀,膨胀,开运算,闭运算,形态学梯度运算,礼帽运算,黑帽运算等操作。其中,腐蚀和膨胀操作是形态学运算的基础,将腐蚀和膨胀操作进行结合,就可以实现开运算、闭运算、形态学梯度运算、礼帽运算、黑帽运算、击中不击中等不同形式的运算。
1.腐蚀cv2.erode(src, kernel)
能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去掉,借此实现去除噪声、元素分割等功能
Kernel表示腐蚀操作时所采用的结构类型,它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
2.膨胀cv2.dilate(src, kernel)
膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。
3.通用形态学函数cv2.morphologyEx(src, op, kernel)
将腐蚀和膨胀操作结合就可以实现开运算,闭运算,形态学梯度运算,礼帽运算,黑帽运算,击中不击中等多种不同形式的运算。
OpenCV提供了函数cv2.morphologyEx()来实现上述形态学操作。
dst = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)
op表示操作类型。
4.开运算cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
开运算进行的操作是,先将图像腐蚀,再对腐蚀的结果进行膨胀,开运算可以用于去噪,计数等。通过将函数cv2.morphologyEx()中操作类型op设置为cv2.MORPH_OPEN,就可以实现开运算。
5.闭运算cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
闭运算进行的操作是,先将图像膨胀,再对膨胀的结果进行腐蚀,闭运算可以用于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。通过将函数cv2.morphologyEx()中操作类型op设置为cv2.MORPH_CLOSE,就可以实现闭运算
6.形态学梯度运算cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
形态学梯度运算是用图像的膨胀图像减去腐蚀图像的操作,该操作可以获取原始图像中前景图像的边缘。我们可以通过将通用形态学函数cv2.morphologyEx()中操作类型op设置为cv2.MORPH_GRADIENT,就可以实现形态学梯度运算
7.礼帽运算cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
礼帽运算是用原始图像减去其开运算图像的操作,礼帽运算能够获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。通过将函数cv2.morphologyEx()中操作类型op设置为cv2.MORPH_TOPHAT,就可以实现礼帽运算
8.黑帽运算cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
黑帽运算是用闭运算图像减去原始图像的操作。黑帽运算能够获取图像内部的小孔,或前景色中的小黑点,得到比原始图像的边缘更暗的边缘部分。通过将函数cv2.morphologyEx()中操作类型op设置为cv2.MORPH_BLACKHAT,就可以实现黑帽运算
9.核函数cv2.getStructuringElement(shape, ksize)
在进行形态学操作时,必须使用一个特定的核(结构元)。该核可以自定义生成,也可以通过函数cv2.getStructuringElement()构造。该函数可以构造并返回一个用于形态学处理使用的结构元素。
shape代表形状类型
cv2.MORPH_RECT 矩形结构元素,所有元素值都是1
cv2.MORPH_CROSS 十字体结构元素,对角线元素值为1
cv2.MORPH_ELLIPS 椭圆形结构元素
若有侵权,请联系删除
本读书笔记来源于教材。1
李立宗. OpenCV轻松入门: 面向python[M].北京. 电子工业出版社: 李立宗. 2019.5 ↩︎