OpenCV图像处理(七)图像滤波(2)

1、形态学滤波

简单来说,形态学操作就是基于形状的一系列图像处理操作,最基本的形态学操作:膨胀、腐蚀。在图像处理中,两种操作都是针对白色部分(高亮部分)而言的,膨胀就是对白色部分的扩张,相反,腐蚀是白色部分被腐蚀。
膨胀,就是求局部最大值的操作,所谓的局部是指一个任意大小和形状的卷积核(或称模板,掩码),该核覆盖的像素值中取最大值,赋值给核锚点(通常是中间点)所对应的像素点,这样就会使图像中高亮部分逐渐扩张。
腐蚀,就是膨胀的反操作,核覆盖的像素值中取最小值,效果也是相反的。
开操作,先腐蚀后膨胀,其效果就是去除图像中的一些白色点(高亮点)。
闭操作,先膨胀后腐蚀,其效果就是填补图像中的黑色空洞。
顶帽,原图与开运算之差。
黑帽,原图与比运算之差。

2、函数原型

// 膨胀
void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

// 腐蚀
void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

// 形态学核心函数
void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

// 获取核
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

3、测试代码

膨胀

void test6() {
    Mat src = imread("D:/zi.png");
    cvtColor(src, src, CV_BGR2GRAY);
    threshold(src, src, 200, 255, THRESH_OTSU);
    Mat dilate_img;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9));
    dilate(~src, dilate_img, kernel);
    imshow("binary", ~src);
    imshow("dilate_img", dilate_img);   
}
binary.png
dilate_img.png

腐蚀

void test6() {
    Mat src = imread("D:/zi.png");
    cvtColor(src, src, CV_BGR2GRAY);
    threshold(src, src, 200, 255, THRESH_OTSU);
    Mat erode_img;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9));
    erode(~src, erode_img, kernel);
    imshow("binary", ~src);
    imshow("erode_img", erode_img);
}
erode.png

开操作

void test6() {
    Mat src = imread("D:/gao.png");
    cvtColor(src, src, CV_BGR2GRAY);
    threshold(src, src, 200, 255, THRESH_OTSU);
    Mat open_img;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
    morphologyEx(~src, open_img,MORPH_OPEN,kernel);
    imshow("binary", ~src);
    imshow("open_img", open_img);
}
binary.png
open_img.png

闭操作

void test6() {
    Mat src = imread("D:/gao.png");
    cvtColor(src, src, CV_BGR2GRAY);
    threshold(src, src, 200, 255, THRESH_OTSU);
    Mat close_img;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
    morphologyEx(~src, close_img, MORPH_CLOSE, kernel);
    imshow("binary", ~src);
    imshow("close_img", close_img);
}
close_img.png

顶帽

void test6() {
    Mat src = imread("D:/gao.png");
    cvtColor(src, src, CV_BGR2GRAY);
    threshold(src, src, 200, 255, THRESH_OTSU);
    Mat tophat_img;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
    morphologyEx(~src, tophat_img, MORPH_TOPHAT, kernel);
    imshow("binary", ~src);
    imshow("tophat_img", tophat_img);
}
tophat_img.png

黑帽

void test6() {
    Mat src = imread("D:/gao.png");
    cvtColor(src, src, CV_BGR2GRAY);
    threshold(src, src, 200, 255, THRESH_OTSU);
    Mat blackhat_img;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
    morphologyEx(~src, blackhat_img, MORPH_BLACKHAT, kernel);
    imshow("binary", ~src);
    imshow("blackhat_img", blackhat_img);
}
blackhat_img.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容