opencv图片的腐蚀和膨胀
- 膨胀就是求局部最大值的操作,从数学角度讲,就是将图像与核进行卷积运算。
示例代码:
//#include “opencv/opencv_application.h”
//#include “public.h”
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include
using namespace std;
using namespace cv;
Mat g_srcImage, g_dstImage;
int g_nTrackbarNumber = 0;
int g_nStructElementSize = 3;
void Process();
void on_TrackbarNumChange(int, void *);
void on_ElementSizeChange(int, void *);
int main( int argc, const char* argv[])
{
// OpencvOperator opencvOperator;
// opencvOperator.FullfillblurFilter();
system(“color5E”);
g_srcImage = imread("../data/1.jpg");
if(!g_srcImage.data){printf("error\n"); return false; }
namedWindow("[原始图片]");
imshow("[原始图片]", g_srcImage);
namedWindow("[效果图]");
Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),
Point(g_nStructElementSize, g_nStructElementSize));
erode(g_srcImage, g_dstImage, element);
imshow("[效果图]", g_dstImage);
//创建轨迹条
createTrackbar("腐蚀/膨胀", "[效果图]", &g_nTrackbarNumber, 1, on_TrackbarNumChange);
createTrackbar("内核尺寸", "[效果图]", &g_nStructElementSize, 21, on_ElementSizeChange);
//轮询获取按键信息,若按下q键,程序退出
while(char(waitKey(1)) != 'q') {}
return 0;
}
void Process()
{
//获取自定义的核
Mat element = getStructuringElement(MORPH_RECT, Size(2g_nStructElementSize+1, 2g_nStructElementSize+1),
Point(g_nStructElementSize, g_nStructElementSize));
//进行腐蚀或者膨胀操作
if(g_nTrackbarNumber == 0)
{
erode(g_srcImage, g_dstImage, element);
}
else{
dilate(g_srcImage, g_dstImage, element);
}
imshow("[效果图]", g_dstImage);
}
//腐蚀和膨胀之间切换开关的回调函数
void on_TrackbarNumChange(int , void *)
{
//腐蚀和膨胀之间的效果已经切换,回调函数体内需要调用一次Process函数,使改变后的效果立即生效并显示出来
Process();
}
//腐蚀和膨胀操作内核改变的时的回调函数
void on_ElementSizeChange(int, void *)
{
//内核尺寸已经改变,回调函数体内需要调用一次Process函数,使改变后的效果立即生效并显示出来
Process();
}