Opencv学习(二)形态学操作

(一)定义结构元素

可以通过形态学处理,使其变得丰满,或者去除掉多余的像素。

结构元素可以简单定义为:像素的组合(如下图)

(二)膨胀和腐蚀

在形态学中,通常使用二值图像作为输入图像。在二值图像中,习惯用黑色(低像素值)表示背景物体,白色(高像素值)表示前景物体。

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);
}

原文地址:https://www.cnblogs.com/hongweijiang/p/14876507.html