一、定义结构元素
形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的 getStructuringElement 函数,也可以直接使用 Numpy 的 ndarray 来定义一个结构元素。形象图如下:
如下代码:为上图的十字型结构。当然还可以定义椭圆和矩形等。
椭圆: cv2.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
矩形: cv2.getStructuringElement(cv.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)
二、腐蚀和膨胀
腐蚀:腐蚀会把物体的边界腐蚀掉,卷积核沿着图像滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪声时,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候会使图像缩小,之后再进行膨胀。当然也可以用来将两者物体分开。
"""
腐蚀
cv2.erode(src, # 输入图像
kernel, # 卷积核
dst=None,
anchor=None,
iterations=None, # 迭代次数,默认1
borderType=None,
borderValue=None)
膨胀
cv2.dilate(src, # 输入图像
kernel, # 卷积核
dst=None,
anchor=None,
iterations=None, # 迭代次数,默认1
borderType=None,
borderValue=None)
"""
import cv2
import numpy as np
original_img = cv2.imread('flower.png')
res = cv2.resize(original_img,None,fx=0.6, fy=0.6,
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