礼帽运算是用原始图像减去其开运算图像的操作。黑帽运算是用闭运算减去原始图像的操作。可用核函数构造一些形状特殊的核。
礼帽运算
礼帽运算是用原始图像减去其开运算图像的操作。
礼帽运算能够获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。
语法
result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
演示
分别演示《获取噪声》及《获取更亮的边缘信息》两种效果。
import cv2
import numpy as np
img1 = cv2.imread(r'E:\Blog\OpenCV\newsu.png',0)
kernel1 = np.ones((5,5),np.uint8)
RESULT1 = cv2.morphologyEx(img1,cv2.MORPH_TOPHAT,kernel1)
img2 = cv2.imread(r'E:\Blog\OpenCV\mn.png',0)
kernel2 = np.ones((2,2),np.uint8)
RESULT2 = cv2.morphologyEx(img2,cv2.MORPH_TOPHAT,kernel2)
cv2.imshow('IMG',img1)
cv2.imshow('RESULT1',RESULT1)
cv2.imshow('IMG2',img2)
cv2.imshow('RESULT2',RESULT2)
cv2.waitKey()
黑帽运算
黑帽运算是用闭运算减去原始图像的操作。
黑帽运算能够获取图像内部的小孔,或者前景色中的小黑点。或者得到比原始图像更暗的边缘部分。
语法
result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
示例
import cv2
import numpy as np
img1 = cv2.imread(r'E:\Blog\OpenCV\jian1.png',0)
kernel1 = np.ones((7,7),np.uint8)
RESULT1 = cv2.morphologyEx(img1,cv2.MORPH_BLACKHAT,kernel1)
img2 = cv2.imread(r'E:\Blog\OpenCV\mn.png',0)
kernel2 = np.ones((2,2),np.uint8)
RESULT2 = cv2.morphologyEx(img2,cv2.MORPH_BLACKHAT,kernel2)
cv2.imshow('IMG',img1)
cv2.imshow('RESULT1',RESULT1)
cv2.imshow('IMG2',img2)
cv2.imshow('RESULT2',RESULT2)
cv2.waitKey()
核函数
在进行形态学操作时,必须要使用一个结构元,即核。该核可以自定义生成。也可以用cv2.getStructuringElement()
构造。
语法:
retval = cv2.getStructuringElement(shape, ksize [, anchor])
shape代表形状类型,可能的值为:
类型 说明 cv2.MORPH_RECT 矩形结构的元素 cv2.MORPH_CROSS 十字架结构元素 cv2.MORPH_ELLIPSE 椭圆形结构的元素 - ksize表示结构元素的大小
- anchor表示结构元素中的锚点位置
import cv2
k1 = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
k2 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
k3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
print('k1=\n',k1)
print('k2=\n',k2)
print('k3=\n',k3)
运行结果:
k1=
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
k2=
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
k3=
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]