【OpenCV图像处理】1.10形态学基本操作 - 膨胀、腐蚀

形态学基本操作 - 膨胀与腐蚀

从本节课开始,每个API后面都有一些数学公式,有的比较难,不一定完全掌握公式,不过要知道是怎么回事。

  • 形态学操作(morphology operators)

    • 图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
    • 形态学有四个基本操作:腐蚀、膨胀、开、闭
    • 膨胀与腐蚀是图像处理中最常用的形态学操作手段
  • 膨胀

    • 跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。
  • 腐蚀

    • 原理:腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值。
  • 相关API:getStructuringElement(int shape, Size ksize, Point anchor)
    - 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
    - 大小
    - 锚点 默认是Point(-1, -1)意思就是中心像素

    • dilate(src, dst, kernel) //膨胀
      • 公式: dst ⁡ ( x , y ) = max ⁡ ( x ′ , y ′ ) :  element  ( x ′ , y ′ ) ≠ 0 src ⁡ ( x + x ′ , y + y ′ ) \operatorname{dst}(x, y)=\max _{\left(x^{\prime}, y^{\prime}\right) : \text { element }\left(x^{\prime}, y^{\prime}\right) \neq 0} \operatorname{src}\left(x+x^{\prime}, y+y^{\prime}\right) dst(x,y)=max(x,y): element (x,y)=0src(x+x,y+y)
    • erode(src, dst, kernel) //腐蚀
      • dst ⁡ ( x , y ) = min ⁡ ( x ′ , y ′ ) :  el ement  ( x ′ , y ′ ) ≠ 0 src ⁡ ( x + x ′ , y + y ′ ) \operatorname{dst}(x, y)=\min _{\left(x^{\prime}, y^{\prime}\right) : \text { el ement }\left(x^{\prime}, y^{\prime}\right) \neq 0} \operatorname{src}\left(x+x^{\prime}, y+y^{\prime}\right) dst(x,y)=min(x,y): el ement (x,y)=0src(x+x,y+y)
      • kernel就是上面的 getStructuringElement的返回值,如下面的代码所示:
    int s = element_size * 2 * 1;
    Mat stuElement = getStructuringElement(MORPH_RECT, Size(s,s), Point(-1, -1));
    Mat dst;
    //dilate(src, dst, stuElement, Point(-1, -1), 1); //膨胀
    erode(src, dst, stuElement, Point(-1, -1), 1); //腐蚀
    
  • 下图详细说明了膨胀、腐蚀的区别

    • 膨胀:取核中最大值替换锚点,像素值将会变大,最大为255,即为白色
    • 腐蚀:取核中最小值替换锚点,像素值将会变小,最小值为0,为黑色。

在这里插入图片描述

完整代码:

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat src;
int element_size ;
//这里该回调函数只能是两个参数,多个参数不能使用
void CallBack_demo( int, void *)
{
    int s = element_size * 2 * 1;
    Mat stuElement = getStructuringElement(MORPH_RECT, Size(s,s), Point(-1, -1));
    Mat dst;
    dilate(src, dst, stuElement, Point(-1, -1), 1); //膨胀
	//erode(src, dst, stuElement, Point(-1, -1), 1); //腐蚀

    imshow("getStructuringElement", dst);
    return;
}

int main() {
    std::string path = "../fei.JPG";
    cv::Mat img = cv::imread(path, 5);

    string str_input = "input image";
    string str_output = "output image";
    
    if(img.empty())
    {
        std::cout << "open file failed" << std::endl;
        return -1;
    }
    
    //膨胀、腐蚀操作
    int max_size = 21;
    element_size = 3;
    src = img;
    cv::imshow("src", src);

    //这里回调函数只能是两个参数,多个参数不能使用
    // 第二个参数winname指示了将展示bar的窗口
    // winname – Name of the window that will be used as a parent of the created trackbar.
    createTrackbar("Elemwnt size:", "src", &element_size, max_size, CallBack_demo);
    CallBack_demo(0,0);

    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值