欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【opencv】形态学操作(1)腐蚀与膨胀

程序员文章站 2022-07-14 11:53:47
...

形态学操作(1)腐蚀与膨胀。

简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。

最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:

消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域。
通过以下图像,我们简要来讨论一下膨胀与腐蚀操作(译者注:注意这张图像中的字母为黑色,背景为白色,而不是一般意义的背景为黑色,前景为白色):

【opencv】形态学操作(1)腐蚀与膨胀
【opencv】形态学操作(1)腐蚀与膨胀
腐蚀与膨胀的结构元素B的形状和大小可以是任意的;
可以通过一个API函数进行设定;

getStructuringElement(int shape,Size ksize,Point anchor)

其中:shape可以是以下三种类型:
1:矩形:MORPH_RECT
2:交叉形:MORPH_CROSS
3:椭圆形:MORPH_ELLIPSE

ksize:内核的大小可以是任意的奇数;(1,3,5,7。。。)

anchor:锚点:内核的中心位置;

腐蚀函数:

dilate(src,dst,kernel)

kernel 是上面那个函数设置的内核。

膨胀函数:

erode(src,dst,kernel);

具体应用看下面的案例:

#include<iostream>
#include<cstdlib>
#include<opencv2/opencv.hpp>
#include<highgui/highgui_c.h>
 
using namespace std;
using namespace cv;
Mat src, dst;
char OUTPUT_WIN[] = "output image";
int element_size = 0;
int max_size = 21;
void CallBack_dilate(int, void*);
void CallBack_erode(int, void*);
int main()
{
   
    src = imread("F:/pic/lishi.png",CV_WINDOW_AUTOSIZE);
    if (src.empty())
    {
        cout << "could not load the image!" << endl;
        return -1;
    }
    namedWindow("imput image", CV_WINDOW_AUTOSIZE);
    imshow("imput image", src);
    namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
    createTrackbar("dilate", OUTPUT_WIN, &element_size, max_size, CallBack_dilate);
    CallBack_dilate(0, 0);
    createTrackbar("erode", OUTPUT_WIN, &element_size, max_size, CallBack_erode);
    CallBack_erode(0, 0);
    waitKey(0);
    return 0;
}
//膨胀
void CallBack_dilate(int, void*)
{
    int s = element_size * 2 + 1;
    //设置内核的大小;
    //内核有三种形状;1:矩形:MORPH_RECT; 2:交叉形:MORPH_CROSS .  3:椭圆形:MORPH_ELLIPSE;
    //还可以指定内核大小,以及锚点位置。Point(-1,-1)表示默认为中间点。
    Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    //膨胀操作;src原图, dst 结果图,  structureElement:腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。
    //否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement:
    dilate(src, dst, structureElement);
    imshow(OUTPUT_WIN, dst);
}
//腐蚀
void CallBack_erode(int, void*)
{
    int s = element_size * 2 + 1;
    //设置内核的大小;
    Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    erode(src, dst, structureElement);
    imshow(OUTPUT_WIN, dst);
}