Opencv(C++)笔记--腐蚀与膨胀操作、创建滑动条

目录

1--膨胀操作

2--腐蚀操作

3--腐蚀和膨胀的作用

4--创建滑动条

5--实例代码


1--膨胀操作

① 原理:

        将图像(原图像的一部分 A )与核矩阵(结构元素 B )进行运算,将结构元素 B 覆盖图像 A,A 中与结构元素 B 锚点相重合的像素点,其像素值替换为 B 覆盖范围内最大的像素值。

② Opencv API:

// 生成指定形状的结构元素,用于下面腐蚀和膨胀操作的结构元素(核矩阵)
cv::Mat structureElement = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(s,s), cv::Point(-1, -1)); 

cv::dilate(src, dst, structureElement, cv::Point(-1, -1), 1); // 膨胀

src 表示输入的源图像,dst 表示膨胀处理后的图像,kernel 表示使用的结构元素 B,Point 默认为(-1, -1)表示结构元素 B 的中心点,iteration 表示膨胀的次数;

2--腐蚀操作

① 原理:

        原理与膨胀操作类似,只是 A 中像素点的像素值替换为结构元素B覆盖范围内的最小像素值;

② Opencv API:

// 生成指定形状的结构元素,用于下面腐蚀和膨胀操作的结构元素(核矩阵)
cv::Mat structureElement = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(s,s), cv::Point(-1, -1)); 

cv::erode(src, dst, structureElement, cv::Point(-1, -1), 1); // 腐蚀

src 表示输入的源图像,dst 表示腐蚀处理后的图像,kernel 表示使用的结构元素 B,Point 默认为(-1, -1)表示结构元素 B 的中心点,iteration 表示腐蚀的次数;

3--腐蚀和膨胀的作用

① 消除噪声;

② 分割出独立的图像元素,在图像中连接相邻的元素;

③ 寻找图像中的极大值或者极小值区域;

④ 求出图像的梯度;

膨胀能使图像中的高亮区域增长,桥接缝隙,消除细小的黑点;

而腐蚀操作会使图像中的高亮区逐渐减小,消除“桥梁”,消除细小的白点;

4--创建滑动条

① 使用 cv::createTrackbar() 创建滑动条

char OUTPUT_WIN[] = "output";
cv::namedWindow(OUTPUT_WIN);
cv::createTrackbar("Element Size :", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);

trackbarname:表示滑动条的名称;

winname:绑定的窗口名称;

value:设定滑动条的初始值;

count:滑动条的最大值;

onChange = 0:绑定的回调函数;

userdata = 0:用户的数据被用于传入给回调函数(回调函数的第二个参数)

注:TrackbarCallback 回调函数 必须为 void(int,void*);

5--实例代码

#include <opencv2/opencv.hpp>
# include<cstdio>
using namespace std;

cv::Mat src;
cv::Mat dst;
int element_size = 3;
int max_size = 5;
char OUTPUT_WIN[] = "output";

void CallBack_Demo(int, void*){ // cv::createTrackbar的回调函数规定只能使用上述两个参数
    int s = element_size * 2 + 1;
    // 生成指定形状的结构元素,用于下面腐蚀和膨胀操作的结构元素(核矩阵)
    cv::Mat structureElement = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(s,s), cv::Point(-1, -1)); 

    //cv::erode(src, dst, structureElement, cv::Point(-1, -1), 1); // 腐蚀
    cv::dilate(src, dst, structureElement, cv::Point(-1, -1), 1); // 膨胀

    cv::imshow(OUTPUT_WIN, dst);
}

int main(int argc, char** argv){

    src = cv::imread("./test1.jpg");
    if (src.empty()){
        printf("could not load image..\n");
        return -1;
    }
    cv::imshow("input", src);

    cv::namedWindow(OUTPUT_WIN);
    cv::createTrackbar("Element Size :", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);
    CallBack_Demo(0, 0);

    cv::waitKey(0);
    return 0;
}

分析:上述代码创建了一个滑动条,名称为“Element Size :”,设定的初始值为3,最大值为5,绑定的回调函数为 CallBack_Demo(int, void*),每拖动一次滑块条,都会执行一次回调函数,对图像进行相应参数的膨胀操作;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值