本文共 5813 字,大约阅读时间需要 19 分钟。
膨胀和腐蚀的主要用途:
转载于https://blog.csdn.net/qq_40855366/article/details/81177174
转载于https://jingyan.baidu.com/article/f96699bbf99d9e894f3c1b4c.html
腐蚀原理: 腐蚀:局部最小值(与膨胀相反); ①定义一个卷积核B, 核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint); 通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜; ②将核B与图像A进行卷积,计算核B覆盖区域的像素点最小值; ③将这个最小值赋值给参考点指定的像素; 因此,图像中的高亮区域逐渐减小。void dilate(InputArray src,//输入OutputArray dst, //输出InputArray kernel, //核大小Point anchor=Point(-1,-1),// 锚位置,默认值(-1,-1)为中心int iterations=1, //迭代次数,默认值1int borderType=BORDER_CONSTANT,//图像边界像素模式,默认值BORDER_CONSTANTconst Scalar& borderValue =morphologyDefaultBorderValue()//边界值,有默认值,一般默认即可)
使用dilate函数,一般只需要填前面的三个参数,后面的四个参数都有默认值,而且往往会结合getStructuringElement()
void erode(InputArray src,//输入OutputArray dst, //输出InputArray kernel, //核大小,当为NULL时,表示使用参考点位于中心3*3的核。一般使用函数getStructuringElement()配合使用Point anchor=Point(-1,-1),// 锚位置,(-1,-1)为中心int iterations=1, //迭代次数int borderType=BORDER_CONSTANT,//图像边界像素模式const Scalar& borderValue=morphologyDefaultBorderValue()//边界值)
erode函数与膨胀函数类似前三个参数需要填写,后面的四个参数有默认值可根据需要填写。
getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));参数:shape:表核的形状,矩形MORPH_RECT;交叉形MORPH_CROSS;椭圆形MORPH_ELLIPSE;ksize:核尺寸大小;anchor:锚点的位置,锚点只影响形态学运算结果的偏移;功能:返回指定形状和尺寸的结构元素;
转载于:https://www.cnblogs.com/geek-hao/p/11668248.html
此链接关于createTrackbar的用法很详尽,尤其是代码部分CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0, void* userdata = 0);参数1:trackbarname,这个参数用来给这个滚动条取一个名字;参数2:winname,这个参数用来指定你要吧这个滚动条用到那个窗口上;参数3:value,这个参数用来设置滑块初始值位置,同时记录滑块以后的位置;参数4:count,这个参数用来指定滚动条可以滚动的最大值;参数5:onChange,这个参数可以理解为一个函数类型的变量(当然这样说感觉有点怪),用来接收回调函数函数名的,默认值为0;参数6:userdata,这个变量这个参数是用户传给回调函数的数据,用来处理轨迹条事件,默认值为0。
示例:
//TrackBar发生改变的回调函数void onChangeTrackBar(int pos, void* userdata);//主函数int main() { //trackbar的值 int posTrackBar = 0; //trackbar的最大值 int maxValue = 255; //读入图像,以灰度图形式读入 Mat img = imread("F:\\图片\\timg.jpg", 0); //新建窗口 namedWindow("二值化"); imshow("二值化", img); //创建trackbar,我们把img作为数据传进回调函数中 createTrackbar("pos", "二值化", &posTrackBar, maxValue, onChangeTrackBar, &img); waitKey(); return 0; }// 回调函数void onChangeTrackBar(int posTrackBar, void* img) { // 强制类型转换 Mat src = *(Mat*)(img); Mat dst; // 二值化 threshold(src, dst, posTrackBar, 255, 0); imshow("二值化", dst); }
前景为黑色,背景为黑色时
前景为白色,背景为黑色时
#include#include using namespace cv;using namespace std;Mat src, dst;char OUTPUT_WIN[] = "output image";//定义一个输出窗口名//int element_size = 3;//此处定义滑动条当前值,若此处使用全局变量,就无需在回调函数中定义形参,回调函数可定义为void CallBack_dilate(int , void* );//int max_size = 21;//定义滑动条最大值void CallBack_dilate(int pos, void* userdata); //声明膨胀的回调函数void CallBack_erode(int pos, void* userdata); //声明腐蚀的回调函数int main(){ src = imread("G:/OpenCV/opencv笔记所用图片/wen2.png"); if (src.empty()) { cout << "could not load image..."<< endl; getchar(); return -1; } namedWindow("input image", CV_WINDOW_AUTOSIZE);//命名一个窗口显示输入图像 imshow("input image", src); int element_size = 3;//此处定义滑动条当前值 int max_size = 21;//定义滑动条最大值 Mat strElement; namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);//命名一个窗口显示输出图像 //创建膨胀滑动条 createTrackbar("膨胀 :", OUTPUT_WIN, &element_size, max_size, CallBack_dilate);//滑动条名称,//窗口名称,//滑动条当前值,//滑动条最大值,//回调函数,//最后的用户参数默认不写(也可以传递各种类型数据如Mat,但在回调函数使用时需要转换类型) //创建腐蚀滑动条 createTrackbar("腐蚀 :", OUTPUT_WIN, &element_size, max_size, CallBack_erode); waitKey(0); return 0;}//定义膨胀的回调函数void CallBack_dilate(int element_size, void* strElement) { int s = element_size * 2 + 1; //此处将createTrackbar传递过来的element_size值变为奇数 //此处s必须为奇数,因为后面获取结构元素中的Size(s, s)必须是奇数 Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));//此处定义的结构元素为方形,大小长s,宽s,锚点为中心 dilate(src, dst, structureElement, Point(-1, -1), 1);//膨胀函数,对原始图像进行膨胀,核的大小为structureElement,通过调节核的大小来调节膨胀程度的大小 //erode(src, dst, structureElement); imshow(OUTPUT_WIN, dst); return;}//定义腐蚀的回调函数void CallBack_erode(int element_size, void* userdata) { int s = element_size * 2 + 1; Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));//此处定义的结构元素为方形,大小长s,宽s,锚点为中心 // dilate(src, dst, structureElement, Point(-1, -1), 1); erode(src, dst, structureElement);//腐蚀函数,对原始图像进行腐蚀操作,此处后4个参数采用默认值 imshow(OUTPUT_WIN, dst); return;}