目录
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*),每拖动一次滑块条,都会执行一次回调函数,对图像进行相应参数的膨胀操作;