Opencv学习_形态学操作

形态学操作(morphology)

1.膨胀

描述:膨胀就是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域。

原理:自定义Kernel在原图每个像素进行卷积操作,计算Kernel覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。

相关API:

getStructuringElement(int shape,Size ksize,Point anchor)

shape:MORPH_RECT,MORPH_CROSS,MORPH_ELLIPSE

ksize:大于1

anchor:锚点,默认为中心POINT(-1,-1)

dilate(Mat src,Mat out,Mat element)

效果图:

代码:

int main(int argc, const char* argv[]){
    // read image
    Mat img = imread("lena.png", IMREAD_COLOR);
    Mat out = Mat::zeros(img.rows, img.cols, img.type());
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
    dilate(img, out, element);
    imshow("source", img);
    imshow("dilate", out);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

2.腐蚀

描述:腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域

原理:自定义Kernel在原图每个像素进行卷积操作,计算Kernel覆盖的区域的像素点的最小值,并把这个最小值赋值给参考点指定的像素。

相关API:

errode(Mat src,Mat out,Mat element)

效果图:

代码:

int main(int argc, const char* argv[]){
    // read image
    Mat img = imread("lena.png", IMREAD_COLOR);
    Mat out = Mat::zeros(img.rows, img.cols, img.type());
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
    erode(img, out, element);
    imshow("source", img);
    imshow("out", out);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

3.开操作

描述:使图像的轮廓变得光滑, 使狭窄的连接断开和消除细毛刺,滤除噪声。

原理:先腐蚀后膨胀

相关API:

morphologyEx(img, out, CV_MOP_OPEN, element);(以下闭操作和顶帽黑帽都是用此API,改变参数即可)

效果图:

4.闭操作

描述:能够弥合狭窄的间断, 填充小的孔洞,填补轮廓线中的断裂、也会平滑轮廓的一部分。

原理:先膨胀再腐蚀。

效果图:

5.顶帽

描述:开运算放大了局部低亮度区域,因此,从原图中减去开运算后的图,得到的效果图 突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

原理:原图像与“开运算“的结果图之差

效果图:

6.黑帽

描述:黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。

原理:原图像与“闭运算“的结果图之差

效果图:

形态学梯度

描述:描述图像亮度变化的剧烈程度;当我们想要突出高亮区域的外围时,则可以选用形态学梯度来突出边缘,可以保留物体的边缘轮廓。

原理:膨胀图与腐蚀图之差

效果图:

猜你喜欢

转载自www.cnblogs.com/lengfengyi/p/12517606.html