前言:本文是我在学习opencv时记录的笔记,内容较为简洁,会记录从入门到做项目这段时间的内容,最终目的是完成我的毕业设计,欢迎大家给予批评指正。本篇为《学习OpenCV》和《Python-OpenCV从入门到精通》中有关图像形态学的笔记。
1.腐蚀与膨胀
膨胀是指将一些图像A与核B进行卷积,即计算核B覆盖区域的像素点最大值,并把这个最大值赋给参考点指定的像素,这样就会使图像中的高亮区域逐渐增长。
腐蚀是膨胀的反操作,即计算核B区域像素的最小值,并把这个值放到参考点上。
腐蚀:dst = cv2.erode(src, kernel, anchor, iterations, borderType, borderValue)
膨胀:dst = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)
src:原始图像
kernel:核
anchor:核的锚点位置;
iterations:迭代次数,默认为1;
borderType:边界样式,默认值;
borderValue:边界值,默认值;
dst:腐蚀或膨胀后的图像。
在做形态学操作时,通常使用numpy模块来创建核数组作为核参数,例如:
import numpy as np
k = np.ones((5, 5), np.uint8)
其中,数组数值越大,计算出的效果就越粗糙。
例:对仙人掌进行腐蚀和膨胀操作:
import cv2
import numpy as np
img = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/12/01/cactus.jpg")
k = np.ones((5, 5), np.uint8)
cv2.imshow("img", img)
dst1 = cv2.erode(img, k)
dst2 = cv2.dilate(img, k)
cv2.imshow("erode", dst1)
cv2.imshow("dilate", dst2)
cv2.waitKey()
cv2.destroyAllWindows()
2.开运算与闭运算
开运算是将图像先进行腐蚀操作,再进行膨胀操作,可以用来抹除图像的外部细节或噪声。
闭运算是将图像先进行膨胀操作,再进行腐蚀操作,用来去除图像的内部细节或噪声引起的区域。
对于连通区域分析,通常先采用腐蚀或闭运算来消除纯粹由噪声引起的部分,然后用开运算来连接邻近的区域。
3.形态学梯度
gradient(src) = dilate(src) - erode(src)
形态学梯度操作是用原图像的膨胀操作减去原图像的腐蚀操作,能描述图像亮度变化的剧烈程度,当我们想突出高亮区域的外围时,可以使用此操作。
4.形态学运算
dst = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)
src:原始图像;
op:操作类型:
参数值 | 含义 |
---|---|
cv2.MORPH_ERODE | 腐蚀操作 |
cv2.MORPH_DILATE | 膨胀操作 |
cv2.MORPH_OPEN | 开运算 |
cv2.MORPH_CLOSE | 闭运算 |
cv2.MORPH_GRADIENT | 梯度运算 |
cv2.MORPH_TOPHAT | 顶帽运算 |
cv2.MORPH_BLACKHAT | 黑帽运算 |
kernel:核;
anchor:核的锚点位置;
iterations:迭代次数,默认为1;
borderType:边界样式,默认值;
borderValue:边界值,默认值;
dst:操作后的图像。
例如梯度运算,最后得到了原图的大概轮廓:
k = np.ones((5, 5), np.uint8)
dst3 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k)
5.顶帽运算与黑帽运算
顶帽运算是让原图减去原图的开运算图,黑帽运算是让原图的闭运算图减去原图,当试图孤立的部分相对于其临近的部分有亮度变化时,就可以使用此方法。
顶帽运算可以突出比试图孤立部分的周围更明亮的区域。因为开运算抹除了图像的外部细节,用有外部细节的图减去无外部细节的图,得到的结果就只剩外部细节。
黑帽运算可以突出比试图孤立部分的周围更黑暗的区域。因为闭运算抹除了图像的内部细节,用无内部细节的图减去有内部细节的图,得到的结果就只剩内部细节。
例如:
k = np.ones((5, 5), np.uint8)
dst3 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k) # 顶帽
dst4 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k) # 黑帽