/*
*膨胀和腐蚀
*形态学操作
图像形态学操作-基于形状的一系列图像处理操作的集合,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开、闭
*形态学操作-膨胀
跟卷积操作类似,假设有图像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) //参数:kernel是getStructuringElement得到的结构体,结构元素
腐蚀:erode(src, dst,, kernel)
*动态调整结构元素大小
TrackBar-createTrackbar(const String &trackbarname, const String winName, int *value, int count, Trackbarcallback func, void *userdara = 0)
其中最重要的是callback函数功能,如果设置为NULL就是说只有值update, 但是不会调用callback的函数
*/
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//为了达到动态调整大小的目的,首先要设定结构元素的大小
int element_size = 3;
int max_size = 21;
void CallBack_Demo(int, void*);
Mat src, dst;
int main(int argc, char** argv)
{
src = imread("D:/A_Graduation/learning/opencv/tangwei.jpg");
if (!src.data)
{
printf("Could not load image src1...\n");
return -1;
}
char input_win[] = "input image";
namedWindow(input_win, CV_WINDOW_AUTOSIZE);
imshow(input_win, src);
namedWindow("output window", CV_WINDOW_AUTOSIZE);
createTrackbar("Element Size:", "output window", &element_size, max_size, CallBack_Demo);
//参数分别为:这个Trackbar的名字,"output window"这个窗口上去, “窗口”每次调整值的大小, 它的最大值, callback方法
//这个Trackbar就被放到"output window"窗口上面去了,然后调用CallBack_Demo(),以后当,在Trackbar上拉动这个滑块的时候,它就会自动CallBack_Demo这个方法,然后就会把CallBack_Demo这个方法里面的这些东西给显示出来
CallBack_Demo(0, 0);
waitKey(0);
return 0;
}
void CallBack_Demo(int, void*) //我们在这里面去做我们结构元素的调整
{
int s = element_size * 2 + 1;
Mat structringElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));//结构元素,形状是矩形, Size是(s, s), 锚点为中心点
//dilate(src, dst, structringElement, Point(-1, -1));//膨胀
erode(src, dst, structringElement); //腐蚀
imshow("output window", dst);
return;
}
(09)膨胀和腐蚀
最新推荐文章于 2022-06-26 01:56:29 发布