目录
一、开运算与闭运算
1. 图像开运算
2.图像闭运算
二、图像梯度运算
三、礼帽运算与黑帽运算
开运算是图像依次经过腐蚀、膨胀处理后的过程。图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,并保留原有图像。
图像开运算使用函数 morphologyEx() ,参数cv2.MORPH_OPEN对应开运算。
闭运算是图像依次经过膨胀、腐蚀处理后的过程。图像先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。
图像闭运算使用函数 morphologyEx() ,参数 cv2.MORPH_CLOSE 对应闭运算。
import cv2
import numpy as np
# 读取并修改图片大小
img = cv2.imread('dc.jpg', 0)
img = cv2.resize(img, dsize=(500, 400))
#设置卷积核
kernel = np.ones((5, 5), np.uint8)
# 开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#设置卷积核
kernel = np.ones((5, 5), np.uint8)
# 闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 堆叠显示并保存原图、开运算、闭运算之后的图像
res = np.hstack((img, opening, closing))
cv2.imshow('res', res)
cv2.imwrite('./yunsuan.jpg', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
(结果如图 ,从左到右依次为:原图、开运算、闭运算)
我们大概可以发现,开运算把黑色目标中的白色噪声去掉了,闭运算把白色目标中的黑色噪声去掉了。
接下来我们再看一组结果(从上到下以依次为原图、开运算、闭运算):
(怎么样,效果是不是更明显了)
梯度运算:膨胀图像 — 腐蚀图像
图像梯度运算是膨胀图像减去腐蚀图像的结果,得到图像的轮廓,其中二值图像1表示白色点,0表示黑色点。
import cv2
import numpy as np
# 读取并修改图片大小
img = cv2.imread('erode1.png', 0)
img = cv2.resize(img, dsize=(500, 300))
# 梯度运算
kernel = np.ones((3, 3), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 显示梯度运算之后的图像
cv2.imshow('gradient', gradient)
cv2.imwrite('./gradient.jpg', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
如下图所示:
礼帽=原始输入-开运算结果
import cv2
import numpy as np
# 读取并修改图片大小
img = cv2.imread('tophat.png', 0)
img = cv2.resize(img, dsize=(500, 300))
# 礼帽运算
kernel = np.ones((5, 5), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
res = np.vstack((img, tophat))
cv2.imshow('tophat', res)
cv2.imwrite('./tophat.jpg', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
黑帽=闭运算结果-原始输入
import cv2
import numpy as np
# 读取并修改图片大小
img = cv2.imread('tophat.png', 0)
img = cv2.resize(img, dsize=(500, 300))
# 黑帽运算
kernel = np.ones((5, 5), np.uint8)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
res = np.vstack((img, blackhat))
cv2.imshow('blackhat', res)
cv2.imwrite('./blackhat.jpg', res)
运行结果: