本篇文章介绍图像的形态学处理,如腐蚀、膨胀、开运算、闭运算、顶帽、黑帽等。
主要学习cv.erode(),cv.dilate(),cv.morphologyEx()等函数的使用。
环境:Windows 7(64) Python 3.6 OpenCV 3.4.2
一、腐蚀和膨胀
1.1 erode()、dilate()函数介绍
erode()函数形式如下:
dst = cv.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
功能:对图像进行腐蚀处理。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
kernel:用于腐蚀运算的核结构元素,可以使用getStructuringElement()函数创建。
anchor:锚点,默认为(-1, -1)
iterations:迭代次数
borderType:边界填充类型
borderValue:边界填充值
dilate()函数形式如下:
dst = cv.erode( src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
功能:对图像进行腐蚀处理。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
kernel:用于腐蚀运算的核结构元素,可以使用getStructuringElement()函数创建。
anchor:锚点,默认为(-1, -1)
iterations:迭代次数
borderType:边界填充类型
borderValue:边界填充值
getStructuringElement()函数形式如下:
retval = cv.getStructuringElement( shape, ksize[, anchor] )
功能:返回指定大小和形状的结构元素,用于形态学处理。
参数:
shape:元素形状。
ksize:大小
anchor:锚点,默认为(-1, -1)
shape的取值如下:
cv.MORPH_RECT:矩形结构元素
cv.MORPH_CROSS:十字形结构元素
cv.MORPH_ELLIPSE:椭圆形结构元素
1.2 编程测试
代码如下
import cv2 as cv
import numpy as np
img = cv.imread('1.png',0)
kernel = np.ones((7,7), np.uint8)
#腐蚀
dstErosion = cv.erode(img,kernel,iterations = 1)
#膨胀
dstDilation = cv.dilate(img,kernel,iterations = 1)
#显示
cv.namedWindow('SrcImage')
cv.imshow('SrcImage',img)
cv.namedWindow('Erosion')
cv.imshow('Erosion',dstErosion)
cv.namedWindow('Dilation')
cv.imshow('Dilation',dstDilation)
运行结果对比图如下所示。可以看出腐蚀操作就是让白色区域减少;膨胀就是将白色区域变大。
二、开运算和闭运算等
2.1 morphologyEx()函数介绍
morphologyEx()函数形式如下:
dst = cv.morphologyEx( src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
功能:对图像进行高级的形态学处理,都是基于膨胀和腐蚀的,如形态学梯度,开运算,闭运算,顶帽,黑帽等。
参数:
src:输入图像,可以是灰度图像,可以是彩色图像。
dst:输出图像。
op:形态学处理的类型
kernel:用于腐蚀运算的核结构元素,可以使用getStructuringElement()函数创建。
anchor:锚点,默认为(-1, -1)
iterations:迭代次数
borderType:边界填充类型
borderValue:边界填充值
op参数取值如下:
cv.MORPH_ERODE:腐蚀
cv.MORPH_DILATE:膨胀
cv.MORPH_OPEN:开运算。先腐蚀后膨胀
cv.MORPH_CLOSE:闭运算。先膨胀后腐蚀
cv.MORPH_GRADIENT:形态学梯度。膨胀减去腐蚀
cv.MORPH_TOPHAT:顶帽。原图减去开运算
cv.MORPH_BLACKHAT:黑帽。闭运算减去原图
cv.MORPH_HITMISS:击中击不中。仅支持CV_8UC1
2.2 编程测试
代码如下
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('1.png',0)
kernel = cv.getStructuringElement(cv.MORPH_CROSS,(7,7))
#开运算
dstOpening = cv.morphologyEx(img,cv.MORPH_OPEN,kernel)
#闭运算
dstClosing = cv.morphologyEx(img,cv.MORPH_CLOSE,kernel)
#形态学梯度
dstGradient = cv.morphologyEx(img,cv.MORPH_GRADIENT,kernel)
#顶帽
dstTopHat = cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
#黑帽
dstBlackHat = cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)
#显示
plt.subplot(321),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(322),plt.imshow(dstOpening),plt.title('Opening')
plt.xticks([]), plt.yticks([])
plt.subplot(323),plt.imshow(dstClosing),plt.title('Closing')
plt.xticks([]), plt.yticks([])
plt.subplot(324),plt.imshow(dstGradient),plt.title('Gradient')
plt.xticks([]), plt.yticks([])
plt.subplot(325),plt.imshow(dstTopHat),plt.title('TopHat')
plt.xticks([]), plt.yticks([])
plt.subplot(326),plt.imshow(dstBlackHat),plt.title('BlackHat')
plt.xticks([]), plt.yticks([])
plt.show()
运行结果图如下: