基于OpenCV的形态学操作(二):形态学基本操作及函数调用

一:形态学简介

形态学的操作主要有以下几种:

1.腐蚀:对图像中的信息部分进行缩小操作:cv2.erode(img,kernel)

2.膨胀:对图像中的信息部分进行放大操作:cv2.dilate(img,kernel)

3.开运算:先腐蚀后膨胀,由此可知先腐蚀会去掉小的白噪声点,然后通过膨胀将主要大对象保留回来

                 因此其作用是去除图像中有效图像外的白噪声。(去除小对象,保留大对象)

4.闭运算:先膨胀后腐蚀,由此可知先膨胀会将主要大对象放大,从而借此掩盖掉小的孔洞,即黑点,然后通过腐蚀将主要对象

                 调整为原来大小。

                  因此其作用是去除图像中有效图像内的黑噪声。(清除孔洞)

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);

 

你可能感兴趣的:(图像识别,图像分割,图像处理)