文章目录
1. 腐蚀 & 膨胀
1.1什么是腐蚀&膨胀
腐蚀&膨胀是图像形态学中的两种核心操作,
腐蚀可以描述为是让图像沿着自己的边界向内收缩,
而膨胀则刚好与收缩相反,可以描述为是让图像沿着边界向内扩张。
这两种操作的逻辑和作用都和上篇(第九篇)讲到的使用滤波器做平滑处理有些类似,不同之处在于,腐蚀求的是滤波核内像素的最小值,而膨胀求的是最大值。并将计算出的值复制给锚点位置的像素。
作用上同平滑处理类似,可以消除噪声。
因为腐蚀求的是最小值,膨胀求的是最大值,所以经过腐蚀操作的图像的总体亮度会有所降低,而经过膨胀操作的图像的总体亮度会有所升高。
为方便示例,准备以下图片素材(test1.jpg):
1.2 腐蚀方法 cv2.erode()
python中OpenCV使用cv2.erode()方法实现腐蚀操作。
该方法语法如下:
cv2.erode(src, kernel, anchor=None, iterations=None, borderType=None, borderValue=None)
- scr 原图像
- kernel 腐蚀要用到的核
- anchor 锚点
- iterations 可选参数,腐蚀操作的迭代次数,默认为1。
- borderType 边界样式,可选。
- borderValue 边界值,可选。
其中kernel这个参数,核,需要手动取创建一个数组,而不能是像滤波器那样指定一个大小。
import cv2 import numpy as np img = cv2.imread("test1.jpg") # 创建3*3的数组作为滤波核 k = np.ones((3, 3), np.uint8) dst = cv2.erode(img, k) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
腐蚀效果如下,如图,我们的鱼骨显得年代更久远了,鱼刺消失、变暗了相当一部分。
1.3 膨胀方法 cv2.dilate()
python中OpenCV使用cv2.dilate()方法实现膨胀操作。
该方法语法如下:
dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
可以看出,其参数用法同cv2.erode()的参数。
import cv2 import numpy as np img = cv2.imread("test1.jpg") # 创建16*16的数组作为核 k = np.ones((16, 16), np.uint8) dst = cv2.dilate(img, k) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
膨胀效果如下,如图所示,图片众多鱼的亮度明显变高了。
2. 开运算 & 闭运算
2.1 简述
开运算就是将图像先进性腐蚀操作,再进行膨胀操作。其可以用来抹除图像外部的细节(噪声)。
闭运算则与之相反,
闭运算是先对图像进行膨胀操作,在进行腐蚀操作。其可以用来抹除图像的内部细节(噪声)。
腐蚀和膨胀虽然是逆操作,但是开运算和闭运算都不会使图像恢复原状。
2.2 开运算
以 3 为核
代码示例如下
import cv2 import numpy as np img = cv2.imread("test1.jpg") k = np.ones((3, 3), np.uint8) dst = cv2.erode(img, k) dst = cv2.dilate(dst, k) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()
2.3 闭运算
以 10 为核
代码示例如下
import cv2 import numpy as np img = cv2.imread("test1.jpg") k = np.ones((10, 10), np.uint8) dst = cv2.dilate(img, k) dst = cv2.erode(dst, k) cv2.imshow("dst", dst) cv2.waitKey() cv2.destroyAllWindows()