zoukankan      html  css  js  c++  java
  • OpenCV-C++ 图像形态学操作

    这一节主要介绍几种图像形态学操作, 主要包括:膨胀, 腐蚀,开,闭四种处理操作;

    另外,在显示图像中的同时,加入动态调整参数的滑动条;

    另外,在显示图像中的同时,加入动态调整参数的滑动条;

    完整的代码在文章最后;

    需要注意的是,重要的不是如何调用API,而是理解每一种形态学操作所起到的作用;

    形态学操作

    图像形态学操作(Morphology Operators)指的是基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学;

    其中,膨胀和腐蚀是最常用的形态学处理操作;

    膨胀操作(dilate)

    • 与卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状;

    膨胀dilate的API使用介绍:

    dilate( InputArray src, OutputArray dst, InputArray kernel,
           Point anchor = Point(-1,-1), int iterations = 1,
           int borderType = BORDER_CONSTANT,
           const Scalar& borderValue = morphologyDefaultBorderValue() );
    
    • src表示需要处理的原始图像
    • dst表示处理后的输出图像
    • kernel结构元素
    • anchor锚点,默认中心像素;
    • iterations迭代处理的次数;

    膨胀操作的作用:

    • 通过取最大值,使得图像形状变粗;

    腐蚀操作(erode)

    • 与膨胀类似,但是使用最小像素值用来替换锚点的像素;

    腐蚀erode的API使用介绍:

    erode( InputArray src, OutputArray dst, InputArray kernel,
           Point anchor = Point(-1,-1), int iterations = 1,
           int borderType = BORDER_CONSTANT,
           const Scalar& borderValue = morphologyDefaultBorderValue() );
    
    • src表示需要处理的原始图像
    • dst表示处理后的输出图像
    • kernel结构元素
    • anchor锚点,默认中心像素;
    • iterations迭代处理的次数;

    腐蚀操作的作用:

    • 通过取最小值,使得图像中形状变细;

    开操作(open)

    • 先腐蚀,后膨胀
    • 可以去掉小的对象

    使用方式:

    Mat structureElement = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
    morphologyEx(src, dst, MORPH_OPEN, structureElement, Point(-1, -1), 1);
    

    开操作的作用:

    • 常用于图像中的噪声消除
    • 通过对小对象放在背景中来从图像的前景中移除;

    闭操作(close)

    • 先膨胀,后腐蚀
    • 可以去掉小的洞

    使用方式:

    Mat structureElement = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
    morphologyEx(src, dst, MORPH_CLOSE, structureElement, Point(-1, -1), 1);
    

    闭操作的作用:

    • 能够填充间隙来闭合形状的操作,也可以用来去除噪声;
    • 通过把背景中的小对象来放入前景中来移除前景的小孔;

    形态学梯度--Morphological Gradient

    • 膨胀减去腐蚀
    • 又称基本梯度(其他还包括内部梯度, 方向梯度)

    形态学梯度的作用:

    • 通过获取图像的膨胀和腐蚀之间的差异,绘制围绕形状的边界;

    顶帽--Top hat

    • 源图像与开操作之间的差值

    顶帽的作用:

    • 从图像中提取更精细的细节;

    黑帽--Black hat

    • 闭操作与源图像的差值

    黑帽的作用:

    • 从图像中提取更精细的细节;

    上述一些形态学处理操作的作用并不是唯一的,需要根据具体的应用场景,选择合适的操作;

    完整的代码如下:

    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    Mat src, dst;
    int elementSize = 3;
    int maxSize = 22;
    char OUPUT_TITLE[] = "output_image";
    
    void CallBackDemo(int, void*);
    
    int main(){
    
        // 读取图像
        src = imread("/home/chen/dataset/MorphologyOperators.png");
        if (src.empty()){
            cout << "cloud not load image." << endl;
            return -1;
        }
    
        // 获取结构元素
        int s = 3;
        Mat structreElement = getStructuringElement(MORPH_RECT, Size(s, s));
        namedWindow("src", WINDOW_AUTOSIZE);
        imshow("src", src);
    
        // 显示处理后的图像
        namedWindow(OUPUT_TITLE, WINDOW_AUTOSIZE);
        createTrackbar("Parmaters: ", OUPUT_TITLE, &elementSize, maxSize, CallBackDemo);
        CallBackDemo(0, 0);
        
        waitKey(0);
    
        return 0;
    }
    
    void CallBackDemo(int, void*){
        
        // 创建结构元素
        int s = elementSize * 2 + 1;
        Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    
        // 膨胀操作
        // dilate(src, dst, structureElement, Point(-1, -1), 1);
    
        // 腐蚀操作
        // erode(src, dst, structureElement, Point(-1, -1), 1);
    
        // 开操作
        // morphologyEx(src, dst, MORPH_OPEN, structureElement, Point(-1, -1), 1);
    
        // 闭操作
        // morphologyEx(src, dst, MORPH_CLOSE, structureElement, Point(-1, -1), 1);
    
        // 形态学梯度
        // morphologyEx(src, dst, MORPH_GRADIENT, structureElement, Point(-1, -1), 1);
    
        // 顶冒-Top hat
        // morphologyEx(src, dst, MORPH_TOPHAT, structureElement, Point(-1, -1), 1);
    
        // 黑帽--Black hat
        morphologyEx(src, dst, MORPH_BLACKHAT, structureElement, Point(-1, -1), 1);
    
        imshow(OUPUT_TITLE, dst);
        return;
    }
    
  • 相关阅读:
    drf 02 APIView的请求生命周期及各个模块源码分析和配置
    drf 03 序列化模块
    Django-restframework框架01
    javascript深入理解闭包(转)
    从经典问题来看 Copy 方法(转)
    JavaScript要点(七) 函数调用
    关于iOS中SQLITE句柄的使用的细节
    Xcode8 创建NSManageObject subclass方法
    JavaScript要点 (六) 函数参数
    JavaScript要点 (五) 函数定义
  • 原文地址:https://www.cnblogs.com/chenzhen0530/p/14630229.html
Copyright © 2011-2022 走看看