一:形态学简介 形态学的操作主要有以下几种:
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);
推荐阅读
- opencv|图像处理之椒盐噪声的添加与去除
- OpenCV|【OpenCV 完整例程】89. 带阻滤波器的传递函数
- OpenCV|【OpenCV 完整例程】90. 频率域陷波滤波器
- OpenCV|【OpenCV 完整例程】22. 图像添加非中文文字
- OpenCV|【OpenCV 完整例程】91. 高斯噪声、瑞利噪声、爱尔兰噪声
- 灰度世界算法(Gray World Algorithm)和White Patch Retinex算法
- 安卓开发|通过RenderScript 实现 NV21转Bitmap、两张Bitmap按照透明度混合的工具类
- 基于SLIC的细胞分割与检测
- github|大佬深夜怒爬某 Hub 站资源,只为撸这个鉴黄平台!
- 科学计算|超像素分割