图像形态学处理经常被应用于各种场景下,本文将介绍开闭运算对图片的腐蚀和膨胀,图像开运算,闭运算,击中不击中,形态学梯度,顶帽运算等。主要涉及函数morphologyEx的使用。
函数定义函数定义
void morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
参数:
src: 输入图像
dst: 输出图像
op:形态学运算类型,可以取下列枚举值,分别实现膨胀、腐蚀、开运算、闭运算、击中击不中、形态学梯度、顶帽、黑帽运算。
kernal:输入结构元素,可以自己定义,也可以采用默认的枚举值
anchor:锚点,通常采用默认值
iteration:迭代次数
borderType:边界类型
borderValue:边界值,通常采用默认值
参数取值说明
1.op=MORPH_ERODE (图片腐蚀)
img=cv2.imread("xxx.jpg")
gravy=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, closey = cv2.threshold(gravy, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
kernely = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
#腐蚀 迭代一次
closey = cv2.morphologyEx(closey, cv2.MORPH_ERODE, kernely, iterations=1)
paper=cv2.cvtColor(closey,cv2.COLOR_BGR2RGB)
merge = np.hstack((img, paper))
plt.figure("MORPH_CLOSE")
plt.title("MORPH_CLOSE")
plt.imshow(merge)
plt.show()
2.op=MORPH_DILATE (图片膨胀)
图标被膨胀过后丢失部分像素,表现为
3.op=MORPH_OPEN (开运算)
对图片做开运算相当于市先腐蚀,后膨胀。在一定程度上可以去除杂质,这里核大小设置为5*5,迭代5次,表现如下
4.op=MORPH_CLOSE (闭运算)
对图片做闭运算,先膨胀,后腐蚀,可以起到涂块作用,用于区域切割。这里核大小设置为3*3,迭代5次,表现如下
5.op=MORPH_HITMISS (击中与不击中运算)
对图片做击中与不击中运算可以一定程度上清除杂质污点,核设置3*3,迭代5次,标下如下
6.op=MORPH_GRADIENT (形态学梯度)
形态学梯度处理,在一定程度上能体现细节边缘,核设置5*5,迭代1次,表现如下:
op可取值列表
MORPH_ERODE = 0, //!< see #erode
MORPH_DILATE = 1, //!< see #dilate
MORPH_OPEN = 2, //!< an opening operation
MORPH_CLOSE = 3, //!< a closing operation
MORPH_GRADIENT = 4, //!< a morphological gradient
MORPH_TOPHAT = 5, //!< "top hat"
MORPH_BLACKHAT = 6, //!< "black hat"
MORPH_HITMISS = 7 //!< "hit or miss"
kernal 内核默认取值列表
MORPH_RECT = 0, //!< a rectangular structuring element: \f[E_{ij}=1\f]
MORPH_CROSS = 1, //!< a cross-shaped structuring element:
MORPH_ELLIPSE = 2 //!< an elliptic structuring element, that is, a filled ellipse inscribed