腐蚀和膨胀(erode and dilate)

腐蚀和膨胀

在这两个操作中都需要有一个滑动窗口一样的小块,这个小块在整副图像上面进行一个像素一个像素的滑动。

膨胀

膨胀操作:当前像素值等于该小块覆盖下的图像区域的最大像素值。
从而当背景色为白色,字体为黑色时,执行一次膨胀操作,黑色字体将变细。
相关的api使用:

Mat ele = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
dilate(src,dst,ele,Point(-1,-1));

MORPH_RECT:滑动块为矩形
MORPH_CROSS:滑动块为十字型
MORPH_ELLIPSE:滑动块为椭圆形
Point(-1,-1):使用默认的锚点

腐蚀

腐蚀操作:当前像素值等于该小块覆盖下的图像区域的最小像素值。
从而当背景色为白色,字体为黑色时,执行一次腐蚀操作,黑色字体将变粗。
相关api的使用:

Mat ele = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
erode(src,dst,ele);

附加

为了调试参数方便,使用createTrackbar()函数来将要变化的参数值变成可拖动的进度条,方便测试最合适的参数。
具体的应用:

#include <ros/ros.h>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int eroding_x = 1;
int eroding_y = 1;
int dilate_x = 1;
int dilate_y = 1;
Mat src;



void Erod(int,void*);
void Dila(int,void*);

int main(int argc, char *argv[])
{
    src = Mat::ones(Size(400,400),CV_32F);
    putText(src,"test",Point(100,100),3,2,Scalar(0,0,0),3);
    line(src,Point(10,10),Point(10,300),Scalar(0,0,0),3,8);
    line(src,Point(10,10),Point(300,10),Scalar(0,0,0),3,8);
    imshow("src",src);

    namedWindow("Dilate window",CV_WINDOW_AUTOSIZE);
    namedWindow("Eroding window",CV_WINDOW_AUTOSIZE);
    
    createTrackbar("dilate x size","Dilate window",&dilate_x,17,Dila);
    createTrackbar("dilate y size","Dilate window",&dilate_y,17,Dila);

    createTrackbar("eroding x size","Eroding window",&eroding_x,17,Erod);
    createTrackbar("eroding y size","Eroding window",&eroding_y,17,Erod);
    waitKey(0);
    return 0;
}

void Dila(int,void*)
{
    if(dilate_x > 0 && dilate_y > 0)
    {
        Mat ele = getStructuringElement(MORPH_CROSS,Size(dilate_x,dilate_y),Point(-1,-1));
        Mat temp;
        dilate(src,temp,ele,Point(-1,-1));
        imshow("dilate",temp);
    }
    else
    {
        cout << "the dilate_x  and dilate_y don't equals 0" << endl;
    }
}

void Erod(int,void*)
{
    if(eroding_x > 0 && eroding_y > 0)
    {
        Mat ele = getStructuringElement(MORPH_RECT,Size(eroding_x,eroding_y),Point(-1,-1));
        Mat temp;
        erode(src,temp,ele);
        imshow("erode",temp);
    }
    else
    {
        cout << "the eroding_x and eroding_y don't equals 0" << endl;
    }
}

其中:

createTrackbar(
	拖动条的名字,
	所在弹出框的名字,
	&改变的变量,
	拖动条的最大值,
	回调的函数
);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值