• OpenCV基础(七)---形态学基础:腐蚀与膨胀


    形态学图像处理

    形态学是研究动植物形态(form)的科学。这里我们使用同一术语表示数学形态学的内容。

    数学形态学(Mathematical morphology) 是一门建立在格论拓扑学基础之上的图像分析学科,

    是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀膨胀开运算闭运算

    骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等

    预备知识

    对一副二值图像进行形态学处理,首先要定义结构元(SE),结构元的形状通常为矩形和圆形。

    如图1,阴影部分为结构元B,白色部分是添加的最小可能的背景元素以构成矩形。

    对图2,图像A进行一种形态学处理得到图3.

    处理方法:结构元B在集合A上进行移动,若阴影部分完全重合,此时结构元的中心点,在新图像上标记为阴影.

    可以看到,在边缘处,B不能完全包含在A中,最终边界被腐蚀掉了.

    PS:灰度图像与此类似,定义方法不同

             

      图1 结构元                          图2 处理前                                                       图3  处理后 

    膨胀

     集合A和集合B,A⊕B表示为B对A的膨胀,定义为,

    这个公式,以B关于它原点的映像,并且以z对映像进行平移,B对A的膨胀是所有位移z的集合.

    灰度形态学是二值形态学的扩展,研究对象是
    灰度图像。在灰度形态学中,膨胀与腐蚀运算相当
    于求局部最大值和最小值操作。膨胀与腐蚀运算
    是其他形态学操作的基础,可利用灰度形态学膨胀
    与腐蚀组成的形态学变换对灰度图进行滤波、边缘
    检测、分割、纹理分析等。

    灰度图的膨胀:

    膨胀的目的是求局部最大值,即计算结构元素
    在图像中所覆盖区域的像素点最大值,并把这个最大值赋给当前结构元素中心指定的像素.

    腐蚀

    集合A和集合B,A㊀B表示为B对A的腐蚀,定义为,

    该式指出B对A的腐蚀是一个用z平移的B包含在A中所有的点z的集合.

    灰度图的腐蚀:

    腐蚀是膨胀的对偶操作,计算图像中被结构元素覆盖区域的最小像素值,

    并把当前结构元素中心所在的像素置为最小值

    函数介绍

    Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

    函数功能:返回指定形状和大小的结构元

    函数声明:

    • shape  结构元的形状,可以为cv::MorphShapes中的一种
    • ksize  结构元的尺寸
    • anchor  锚点默认为结构元中心,一般取默认
    void dilate( InputArray src, OutputArray dst, InputArray kernel,
                              Point anchor = Point(-1,-1), int iterations = 1,
                              int borderType = BORDER_CONSTANT,
                              const Scalar& borderValue = morphologyDefaultBorderValue() );

    函数功能:膨胀图像

    参数声明略    

     void erode( InputArray src, OutputArray dst, InputArray kernel,
                             Point anchor = Point(-1,-1), int iterations = 1,
                             int borderType = BORDER_CONSTANT,
                             const Scalar& borderValue = morphologyDefaultBorderValue() );

    函数功能:腐蚀图像

    参数声明略

    代码

     1 #include <opencv2/opencv.hpp> 
     2 #include <iostream> 
     3 using namespace cv;
     4 using namespace std;
     5 Mat src, dst;
     6 char output_title[] = "dilate image";
     7 int element_size = 3;
     8 int max_size = 21;
     9 void CallBack_Demo(int, void*);
    10 int main() {
    11 
    12     src = imread("D:/cat.png");
    13     if (!src.data) {
    14         cout << "could not load image..." << endl;
    15         return -1;
    16     }
    17     imshow("input image", src);
    18 
    19     namedWindow(output_title, CV_WINDOW_AUTOSIZE);
    20     createTrackbar("Element Size :", output_title, &element_size, max_size, CallBack_Demo);
    21     CallBack_Demo(0, 0);
    22 
    23     waitKey(0);
    24     return 0;
    25 }
    26 
    27 void CallBack_Demo(int, void*) {
    28     int s = element_size * 2 + 1;
    29     Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    30     dilate(src, dst, structureElement, Point(-1, -1), 1);
    31     //erode(src, dst, structureElement, Point(-1, -1), 1);
    32     imshow(output_title, dst);
    33     return;
    34 }

    效果对比图

      

       

  • 相关阅读:
    Linux网络编程系列-TCP传输控制
    Lucene系列-索引文件
    python Web开发框架-Django (1)
    安卓课本例子-01-使用XML布局文件控制用户界面
    javaEE--数据库01
    安卓-08-布局管理器
    安卓-07-开发自定义的View--实践-跟随手指移动的小兔子
    安卓-06-使用XML和Java设置UI--实例--03--QQ相册
    安卓-05-使用Java设置UI--实验02-使用Java实现UI设置
    安卓-04-实例01-XML布局UI界面
  • 原文地址:https://www.cnblogs.com/zmm1996/p/10678198.html
Copyright © 2020-2023  润新知