图像识别|基于OpenCV的形态学操作(二)(形态学基本操作及函数调用)

一:形态学简介 形态学的操作主要有以下几种:
1.腐蚀:对图像中的信息部分进行缩小操作:cv2.erode(img,kernel)
2.膨胀:对图像中的信息部分进行放大操作:cv2.dilate(img,kernel)
3.开运算:先腐蚀后膨胀,由此可知先腐蚀会去掉小的白噪声点,然后通过膨胀将主要大对象保留回来
因此其作用是去除图像中有效图像外的白噪声。(去除小对象,保留大对象)
4.闭运算:先膨胀后腐蚀,由此可知先膨胀会将主要大对象放大,从而借此掩盖掉小的孔洞,即黑点,然后通过腐蚀将主要对象
调整为原来大小。
【图像识别|基于OpenCV的形态学操作(二)(形态学基本操作及函数调用)】因此其作用是去除图像中有效图像内的黑噪声。(清除孔洞)
5.顶帽:原图像与开运算后的图像之差。突出比原图轮廓较亮的区域。
6.黑帽:闭运算后的图像与原图像之差。突出比原图轮廓较暗的区域。
7.梯度:提取图像中的轮廓。
二:形态学操作基本函数 cv2.morphologyEx(img,operatename,kernel)
其中kernel为结构元素,接下来会作介绍。
operatename:形态学操作名:
cv2.MORPH_ERODE腐蚀
cv2.MORPH_DILATE膨胀
cv2.MORPH_OPEN开运算
cv2.MORPH_CLOSE闭运算
cv2.MORPH_TOPHAT顶帽
cv2.MORPH_BLACKHAT黑帽
cv2.MORPH_GRADIENT梯度
三:结构元素 形态学运算是把一个定义好的‘结构元素’应用于一幅图像,通过比较(xi,yi)处的输入像素值及其领域的像素值来计算(xi,yi)处的像素值,从而得到一幅新的图像。而所选择的结构元素不同,形态学运算的结果也不同。
换而言之,形态学运算都是基于特定的或指定的形状的大小和形状来进行的,而这个特定或指定的形状即结构元素
官方函数有:cv2.getStructuringElement(type,(w,h))
其类型有:cv2.MORPH_CROSS十字形
cv2.MORPH_ELLIPSE圆形
cv2.MORPH_RECT矩形

import cv2; import numpy as np; # -------------------------------------------------------------------------------- # 添加椒盐噪声 def noise(th2,s): for i in range(2000): _x=np.random.randint(0,th2.shape[0]); _y=np.random.randint(0,th2.shape[1]); if s=='open': th2[_x][_y]=255; #开运算 elif s=='close': th2[_x][_y]=0; #闭运算 return th2; # -------------------------------------------------------------------------------- # 形态学操作 def morph_operate(img,kernel,s='gradient'): '''img: image matrix kernel: structure element s: operate name(erode,dilate,open,close,gradient,tophat,blackhat)''' if s=='erode': # 对输入图像用特定结构元素进行腐蚀操作 cv2.erode(img,structure_element) # 表现形式:图像中信息部分(主要是亮度较高的像素)缩小 # 腐蚀算法:用结构元素对应的矩阵,扫描图像的每一个像素,用结构元素与其覆盖的图像做“与”运算。 #如果都为1,结构图像的该像素为1,否则为0;结果:使图像减小一圈。 return cv2.erode(img,kernel); elif s=='dilate': # 进行膨胀操作 cv2.dilate(img,structure_element) # 表现形式:图像中信息部分(主要是亮度较高的像素)放大 # 膨胀算法:用结构元素对应的矩阵,扫描图像的每一个像素,用结构元素与其覆盖的图像做“或”运算。 #如果都为0,结构图像的该像素为0,否则为1;结果:使图像放大一圈。 return cv2.dilate(img,kernel); elif s=='open': # 开运算:腐蚀(去除图像外小点点)->膨胀(去除图像外噪声) # 开运算主要用于去除有效图像外的白噪点 return cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel); elif s=='close': # 闭运算:膨胀(去除图像中小点点)->腐蚀(去除图像内噪声,得到主图像) # 闭运算主要用于去除有效图像内的黑噪点 return cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel); elif s=='gradient': # 形态学梯度:膨胀图-腐蚀图,使处理后的图像如同提取了轮廓 return cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel); elif s=='tophat': # 顶帽:原始图像-开运算后的图像 # 在差别之处显示原有颜色 # 常用于分离比临近点较亮的斑块 # 表现效果为:突出比原图轮廓周围区域更明亮的区域 return cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel); elif s=='blackhat': # 黑帽:闭运算后的图像-原始图像 # 在差别之处显示原有颜色反颜色 # 常用于分离比临近点较暗的斑块 # 表现效果为:突出比原图轮廓周围区域更暗的区域 return cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel);


    推荐阅读