Opencv知识点-21节膨胀与腐蚀

内容分享3小时前发布
0 0 0

1、膨胀

膨胀就是求领域最大值的操作,把这个最大值赋值给锚点,这样使得高亮区域扩张

膨胀函数—dilate()函数

dialte(输入矩阵,输出矩阵,InputArray kernel,Point anchor = Point(-1,-1),int iterations =1,int borderType = BORDER_CONSTANT,const Scalar& borderValue=
morphologyDefaultBorderValue());

kernel是核,当为NULL时,表明使用3*3的核,一般使用函数getStructuringElement()来获得一个核,其第一个参数是核的形状。

矩形:MORPH_RECT;

交叉形:MORPH_CROSS

椭圆形:MOPH_ELLIPSE

第二个,第三个尺寸为核的尺寸和锚点的位置

一般先定义一个Mat类来作为内核的返回值

int g_nStructElementSize = 3;//结构元素(内核矩阵)的尺寸

//获取自定义核

Mat element = getStructuringElement(MORPH_RECT,Szie(2*g_nStructElemnetSIze+1,2*g_nStructElemnetSize+1),Point(g_nStructElemnetSize,g_nStructElemnetSize));

iterations 表明迭代使用erode()函数的次数,默认值为1

borderValue常用默认值
morphologyDefaultBorderValue()使用dilate()函数一般只需要输入前三个参数,后面都默认值自动填充

2、腐蚀

腐蚀是与膨胀相反的操作,是求领域最小值,然后把最小值赋值给锚点的过程

这样就使得按区域的扩张

腐蚀函数–erode()

erode(输入矩阵,输出矩阵,

InputArray kernel,

Point anchor=Point(-1,-1),

int iterations=1,

int borderType=BORDER_CONSTANT,

const Scalar& borderValue=morphologyDefaultBorderValue()

);

参数都跟膨胀一样,所以不再解释

int test14() {

Mat img = imread(“C:\Users\86188\Desktop\526.jpg”,0);

Mat img_Treshold;

img.copyTo(img_Treshold);

for (int r = 0; r < img.rows; r++)

{

uchar*dstptr = img_Treshold.ptr<uchar>(r);

const uchar*srcptr = img.ptr<uchar>(r);

for (int c = 0; c < img.cols; c++)

{

if (srcptr[c] > 135) {

dstptr[c] = 255;

}

else

{

dstptr[c] = 0;

}

}

}

Mat dilateImg;

Mat erodeImg;

dilate(img_Treshold, dilateImg, 3);

dilate(dilateImg, dilateImg, 5);

dilate(dilateImg, dilateImg, 5);

erode(img_Treshold, erodeImg, 3);

erode(erodeImg, erodeImg, 5);

erode(erodeImg, erodeImg, 5);

imshow(“img_Treshold”, img_Treshold);

imshow(“dilateImg”, dilateImg);

imshow(“erodeImg”, erodeImg);

imshow(“img”, img);

waitKey(10000000);

return 0;

}

Opencv知识点-21节膨胀与腐蚀

选图问题,可能效果不太明显,我一般应用这两种算法在二维码检测领域表较多

© 版权声明

相关文章

暂无评论

none
暂无评论...