一、定义结构元素

形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的getStructuringElement函数,也可以直接使用NumPy的ndarray来定义一个结构元素。(形象图如下:)
OpenCV—python 形态学处理
如下代码:为上图的十字形结构
当然还可以定义椭圆/矩形等:
椭圆: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()

OpenCV—python 形态学处理

鸣谢
https://blog.csdn.net/sunny2038/article/details/9137759

相关文章: