形态学--morphologyEx

	上篇博客写了膨胀和腐蚀能满足基本的图像处理,但是在处理灰度图或者彩色图时,需要额外的操作,这就用到函数cv2.morphologyEx()。

定义
opencv手册上给出的函数定义为:
dst = cv.morphologyEx( src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]] )
src Source image. The number of channels can be arbitrary. The depth should be one of CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
dst Destination image of the same size and type as source image.
cv.MORPH_ERODE 腐蚀
cv.MORPH_DILATE 膨胀
cv.MORPH_OPEN 开运算 (先腐蚀在膨胀)
dst=open(src,element)=dilate(erode(src,element))
cv.MORPH_CLOSE 闭运算 (先膨胀在腐蚀)
dst=close(src,element)=erode(dilate(src,element))
cv.MORPH_GRADIENT 形态学梯度
dst=morph_grad(src,element)=dilate(src,element)−erode(src,element)
cv.MORPH_TOPHAT 礼帽
dst=tophat(src,element)=src−open(src,element)
cv.MORPH_BLACKHAT 黑帽
dst=blackhat(src,element)=close(src,element)−src
cv.MORPH_HITMISS
Only supported for CV_8UC1 binary images
kernel Structuring element. It can be created using getStructuringElement.
anchor Anchor position with the kernel. Negative values mean that the anchor is at the kernel center.
iterations Number of times erosion and dilation are applied. 注意:在这进行开/闭运算时,例:iterations = 2,开运算 ,顺序为腐蚀-腐蚀-膨胀-膨胀
borderType Pixel extrapolation method, see BorderTypes
borderValue Border value in case of a constant border. The default value has a special meaning.
上述腐蚀和膨胀是对于白色部分而言。

开运算与闭运算

开运算,可以消除高于其临近点的孤立点,可用于去除黑点,同时也可以用于统计二值图像中的区域数。

形态学--morphologyEx_第1张图片

闭运算,可以消除低于其临近点的孤立点,可用于去除黑点,去除噪声引起的区域。

形态学--morphologyEx_第2张图片
形态学梯度

形态学梯度主要用来得到图像中的轮廓,使用膨胀减去收缩,得到亮度变化的区域。没有使用过,具效果没有看到,想要获得轮廓可以使用函数cv2.findCoutours()

礼帽和黑帽

礼帽,是原图减去开运算,开运算是先腐蚀在膨胀,开运算是放大裂缝或剧毒低亮度区域,所以礼帽可以突出比原图周围区域更明亮的区域。黑帽与之相反。
import cv2
import matplotlib.pyplot as plt

img1 = cv2.imread('pic.bmp', 0)
mask1 = cv2.inRange(img1, 200, 255)#二值化,也可不处理
ret, mask = cv2.threshold(mask1, 120, 255, cv2.THRESH_BINARY)

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
thread = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=3)

plt.title('sub_picture')
plt.imshow(thread)

你可能感兴趣的:(opencv)