一、定义结构元素
形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的getStructuringElement函数,也可以直接使用NumPy的ndarray来定义一个结构元素。(形象图如下:)
如下代码:为上图的十字形结构
当然还可以定义椭圆/矩形等:
椭圆:cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
矩形:cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print("elemrnt":element )
------------------------------------------------
import numpy as np
NpKernel = np.uint8(np.zeros((5,5)))
for i in range(5):
NpKernel[2, i] = 1
NpKernel[i, 2] = 1
print("NpKernel ",NpKernel )
上述结果输出(相同):
array([[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]], dtype=uint8)
二、腐蚀和膨胀
import cv2
import numpy as np
original_img = cv2.imread('tangbao.jpg')
res = cv2.resize(original_img,None,fx=0.8, fy=0.8,
interpolation = cv2.INTER_CUBIC) #图形太大了缩小一点
B, G, R = cv2.split(res) #获取红色通道
img = R
_,RedThresh = cv2.threshold(img,160,255,cv2.THRESH_BINARY)
#OpenCV定义的结构矩形元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
eroded = cv2.erode(RedThresh,kernel) #腐蚀图像
dilated = cv2.dilate(RedThresh,kernel) #膨胀图像
cv2.imshow("original_img", res) #原图像
cv2.imshow("R_channel_img", img) #红色通道图
cv2.imshow("RedThresh", RedThresh) #红色阈值图像
cv2.imshow("Eroded Image",eroded); #显示腐蚀后的图像
cv2.imshow("Dilated Image",dilated); #显示膨胀后的图像
#NumPy定义的结构元素
NpKernel = np.uint8(np.ones((3,3)))
Nperoded = cv2.erode(RedThresh,NpKernel) #腐蚀图像
cv2.imshow("Eroded by NumPy kernel",Nperoded); #显示腐蚀后的图像
cv2.waitKey(0)
cv2.destroyAllWindows()
鸣谢
https://blog.csdn.net/sunny2038/article/details/9137759