开操作(open):先腐蚀后膨胀。
作用
如下假设对象是前景色,背景是黑色,腐蚀可把小白点去掉,膨胀又把主对象被腐蚀掉的部分还原回来。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('open.jpg',1)
# cv2.getStructuringElement()来生成不同形状的结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 矩形结构
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # 椭圆结构
kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) # 十字结构
# 使用不同结构元素 执行开操作
opening1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel1)
opening2 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel2)
opening3 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel3)
# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(141),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(142),plt.imshow(opening1),plt.title('RECT'),plt.xticks([]), plt.yticks([])
plt.subplot(143),plt.imshow(opening2),plt.title('ELLIPSE'),plt.xticks([]), plt.yticks([])
plt.subplot(144),plt.imshow(opening3),plt.title('CROSS'),plt.xticks([]), plt.yticks([])
plt.show()
可以看出,同大小的结构元素,去除白噪点,使用矩形结构元素效果最佳。当然,去除白点的效果,还跟所选取的结构大小有关。
闭操作(close):先膨胀后腐蚀(bin2)
作用
如下假设对象是前景色,背景是黑色.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('cell.jpg',1)
# cv2.getStructuringElement()来生成不同形状的结构元素
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 矩形结构
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10, 10)) # 椭圆结构
kernel3 = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10)) # 十字结构
# 使用不同结构元素 执行闭操作
closing1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel1)
closing2 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel2)
closing3 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel3)
# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(141),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(142),plt.imshow(closing1),plt.title('RECT'),plt.xticks([]), plt.yticks([])
plt.subplot(143),plt.imshow(closing2),plt.title('ELLIPSE'),plt.xticks([]), plt.yticks([])
plt.subplot(144),plt.imshow(closing3),plt.title('CROSS'),plt.xticks([]), plt.yticks([])
plt.show()
同样可以看出,同大小的结构元素,填补黑点,使用矩形结构元素效果最佳,去除黑点的效果,还跟所选取的结构大小有关。
形态学梯度(Gradient):膨胀减去腐蚀,又称为基本梯度。其实就是一幅图像膨胀与腐蚀的差别结果看上去就像前景物体的轮廓。
作用: 边缘提取。对二值图像进行这一操作,可以将团块(blob)的边缘突出出来,保留物体的边缘轮廓。
其它还有内部梯度(原图减去腐蚀)、外部梯度(膨胀减去原图)、方向梯度(x方向和y方向进行计算)
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('tiger.jpg',1)
# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) # 矩形结构
# 执行梯度操作
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(121),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(gradient),plt.title('gradient'),plt.xticks([]), plt.yticks([])
plt.show()
顶帽(top hat):是原图像与开操作之间的差值图像。
原始图像与进行开运算之后得到的图像的差。
作用:显示开操作所去掉的小白噪点。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('open.jpg',1)
# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) # 矩形结构
# 执行开、顶帽操作
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(131),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(opening),plt.title('opening'),plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(tophat),plt.title('tophat'),plt.xticks([]), plt.yticks([])
plt.show()
黑帽(black hat):闭操作图像与源图像的差值图像
作用:显示闭操作所填充的小黑洞,或者是闭操作去除的东西。
下面,以闭操作中去除的毛发噪音为例,我们使用黑帽将其显示出来
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('cell.jpg',1)
# cv2.getStructuringElement()来生成结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 矩形结构
# 执行闭、顶帽操作
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
# 显示图像
plt.figure(figsize = (20,15))
plt.subplot(131),plt.imshow(img),plt.title('Original'),plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(closing),plt.title('closing'),plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(blackhat),plt.title('blackhat'),plt.xticks([]), plt.yticks([])
plt.show()