matlab腐蚀膨胀代码_4、腐蚀膨胀操作

8c4cb56ea400a80b1448248babe54f3c.png

OpenCV图片背景色为黑色

腐蚀的作用是消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点;

膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的空洞。

开运算是先腐蚀后膨胀的过程,可以消除图像上细小的噪声,并平滑物体边界。

闭运算时先膨胀后腐蚀的过程,可以填充物体内细小的空洞,并平滑物体边界。

简单来说,腐蚀会放大黑色区域使图片变黑,膨胀会缩小黑色区域使图片变白。

具体原理就不提了,这是入门教程不是上课,反正我看见那些东西就头疼,以实践为主。

原图

88cd9c1038c72907c7e13086123f7a93.png

腐蚀

腐蚀函数为:

void 

参数为(输入,输出,处理核等等)

实验一下

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    //载入原图
    Mat srcImage = imread("1.jpg");
    //显示原图
    imshow("Original", srcImage);
    //进行腐蚀操作
    Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
    Mat dstImage;
    erode(srcImage, dstImage, element);
    //显示效果图
    imshow("Result", dstImage);
    waitKey(0);

    return 0;
}

腐蚀结果:

625c5d6b0965e1a283246d505d36b332.png

膨胀

膨胀函数为:

void cv::dilate (   InputArray      src,
                    OutputArray     dst,
                    InputArray      kernel,
                    Point   anchor = Point(-1,-1),
                    int     iterations = 1,
                    int     borderType = BORDER_CONSTANT,
                    const Scalar &  borderValue=orphologyDefaultBorderValue() 
)

参数为(输入,输出,处理核等等)

实验一下

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    //载入原图
    Mat image = imread("../data/images/1.jpg");
    //显示原图
    imshow("Original Image", image);

    //进行膨胀操作
    Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
    Mat out;
    dilate(image, out, element);

    //显示效果图
    imshow("Result", out);
    waitKey(0);//如果没有,界面会立刻退出

    return 0;
}

结果如下:

362804a5025b25e524b7944d1dfe8956.png

动态显示

动态显示结果需要滑动栏,滑动栏介绍见

OpenCV系列3:界面滑动栏​mp.weixin.qq.com
94c5984f0a233d2d0c0d37eac1862fe4.png

使用滑动栏来控制腐蚀膨胀动态参数设置

动态代码:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

//      描述:全局变量声明
Mat g_srcImage, g_dstImage;//原始图和效果图
int g_nTrackbarNumer = 0;//0表示腐蚀erode, 1表示膨胀dilate
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸

//      描述:全局函数声明
void Process();//膨胀和腐蚀的处理函数
void on_TrackbarNumChange(int, void *);//回调函数
void on_ElementSizeChange(int, void *);//回调函数

int main( )
{
    //载入原图
    g_srcImage = imread("../data/images/1.jpg");
    if( !g_srcImage.data ) { printf("读取srcImage错误~! n"); return false; }

    //显示原始图
    imshow("Original", g_srcImage);

    //进行初次腐蚀操作并显示效果图
    //获取自定义核
    Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));
    erode(g_srcImage, g_dstImage, element);
    imshow("Result", g_dstImage);

    //创建轨迹条
    createTrackbar("腐蚀/膨胀", "Result", &g_nTrackbarNumer, 1, on_TrackbarNumChange);
    createTrackbar("内核尺寸", "Result", &g_nStructElementSize, 21, on_ElementSizeChange);

    //输出一些帮助信息
    cout<<endl<<"t运行成功,请调整滚动条观察图像效果~nn"
        <<"t按下“q”键时,程序退出。n";

    //轮询获取按键信息,若下q键,程序退出
    while(char(waitKey(1)) != 'q') {}

    return 0;
}

//      描述:进行自定义的腐蚀和膨胀操作
void Process() 
{
    //获取自定义核
    Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));

    //进行腐蚀或膨胀操作
    if(g_nTrackbarNumer == 0) {    
        erode(g_srcImage, g_dstImage, element);
    }
    else {
        dilate(g_srcImage, g_dstImage, element);
    }

    //显示效果图
    imshow("Result", g_dstImage);
}

//      描述:腐蚀和膨胀之间切换开关的回调函数
void on_TrackbarNumChange(int, void *) 
{
    //腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
    Process();
}

//      描述:腐蚀和膨胀操作内核改变时的回调函数
void on_ElementSizeChange(int, void *)
{
    //内核尺寸已改变,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
    Process();
}

代码没什么难点,就是函数整合。需要了解前面所说的回调函数。当然了C++不会的话我也没办法。

效果如下:

腐蚀膨胀动态操作_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
467e478e2d53977ccbb73733cba2fac4.png

说明

1、腐蚀膨胀操作需要的核获取腐蚀固定,调用函数获取就行了。

2、鉴于网上OpenCV系统资料太多且杂乱,B站的视频使用的版本又太老了,本系列教程出现的原因就是为了该进一些资料老旧不兼容的问题。本系列会给最终的系列教程视频提供经验,所以有什么问题、建议、意见、改进尽管提。什么姿势我都会。

3、代码在github中。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值