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;
}
选图问题,可能效果不太明显,我一般应用这两种算法在二维码检测领域表较多