(一)定义结构元素
可以通过形态学处理,使其变得丰满,或者去除掉多余的像素。
结构元素可以简单定义为:像素的组合(如下图)
(二)膨胀和腐蚀
在形态学中,通常使用二值图像作为输入图像。在二值图像中,习惯用黑色(低像素值)表示背景物体,白色(高像素值)表示前景物体。
2.1 膨胀
是取核中(即上面的3x3矩阵中)像素值的最大值代替锚点位置的像素值,这样会使图像中较亮的区域增大,较暗的区域减小。如果是一张黑底,白色前景的二值图,就会使白色的前景物体颜色面积变大,就像膨胀了一样。
Mat dialated; //目标图像 dilate(image, dialated, Mat(),Point(-1,-1),5); imshow("dialated", dialated);
2.2 腐蚀
腐蚀操作类似于中值平滑,也有一个核,但不进行卷积运算,而是取核中像素值的最小值代替锚点位置的像素值,这样就会使图像中较暗的区域面积增大,较亮的的区域面积减小。如果是一张黑底,白色前景的二值图,就会使白色的前景物体颜色变小,就像被腐蚀了一样。
Mat eroded;//目标图像 Mat element(4, 4,CV_8U);//核大小 erode(image, eroded, Mat()); imshow("eroded", eroded);
2.3 开运算
先进行腐蚀操作,后进行膨胀操作,主要用来去除一些较亮的部分,即先腐蚀掉不要的部分,再进行膨胀。
Mat opened; morphologyEx(image, opened, MORPH_OPEN, Mat()); imshow("opened", opened);
2.4 闭运算
先进行膨胀操作,后进行腐蚀操作,主要用来去除一些较暗的部分。
Mat closed; morphologyEx(image, closed, MORPH_CLOSE, element, Point(-1, -1), 5); imshow("closed", closed);
2.5 梯度运算
膨胀运算结果减去腐蚀运算结果,可以拿到轮廓信息。
Mat result; morphologyEx(image, result, MORPH_GRADIENT, Mat(),Point(-1,-1),5); imshow("result", result);
2.6 顶帽运算
原始图像减去开运算结果
即:原始带刺的-不带刺的=刺
Mat tophat; morphologyEx(image,tophat, MORPH_TOPHAT, Mat()); imshow("tophat", tophat);
2.7 黑帽运算
原始输入-闭运算结果
Mat blackhat; morphologyEx(image, blackhat, MORPH_BLACKHAT, Mat()); imshow("blackhat", blackhat);
(三)应用实例
提取出文字下划线
void QuickDemo::pengzhanglianxi_demo(Mat& image) { imshow("image", image); Mat img,img_thr,kernel,dst; cvtColor(image, img, COLOR_RGB2GRAY); threshold(img, img_thr, 127, 255, THRESH_BINARY); kernel = getStructuringElement(MORPH_RECT, Size(30, 1)); //ksize – Size of the structuring element. //cols – Width of the structuring element //rows – Height of the structuring element dilate(img_thr, dst, kernel); imshow("img_thr", img_thr); imshow("dst", dst); }