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

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

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

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

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

在这里插入图片描述
在这里插入图片描述
腐蚀与膨胀的结构元素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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值