简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。
最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
1、消除噪声
2、分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
3、寻找图像中的明显的极大值区域或极小值区域。
注意:腐蚀和膨胀是对白色区域(高亮部分)而言,不是黑色部分;膨胀是图像中高亮部分进行膨胀,效果图拥有比原图更大的高亮区域;腐蚀是图像中高亮部分进行腐蚀,效果图拥有比原图更小的高亮区域。
膨胀
求局部最大值,并把最大值赋给参考点指定的像素,这样会使得图像中高亮区域逐渐增长。
进行 腐蚀 操作的函数是 dilate 。 它接受了三个参数:
src: 原图像
dilate _dst: 输出图像
element: 腐蚀操作的内核。 如果不指定,默认为一个简单的 矩阵。否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement:
我们可以为我们的内核选择三种形状之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 椭圆形: MORPH_ELLIPSE
然后,我们还需要指定内核大小,以及 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。
腐蚀
求局部最小值,并把最小值赋给参考点指定的像素,这样会使得图像中高亮区域逐渐减少。
进行 腐蚀 操作的函数是 erode 。 它接受了三个参数:
src: 原图像
erosion_dst: 输出图像
element: 腐蚀操作的内核。 如果不指定,默认为一个简单的 矩阵。否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement:
我们可以为我们的内核选择三种形状之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 椭圆形: MORPH_ELLIPSE
然后,我们还需要指定内核大小,以及 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。
程序
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
//--------------------------------------【main( )函数】-----------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-------------------------------------------------------------------------------------------------
Mat src = imread("D:\VC\c++\opencv源码\opencv源码\12.bmp");
Mat dst1 ,dst2;
int p = 3;//膨胀参数值
int f = 4;//腐蚀参数值
//膨胀回调函数
void on_p(int, void*)
{
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(p * 2 + 1, p * 2 + 1));
dilate(src, dst1, element);
imshow("膨胀图", dst1);
}
//腐蚀回调函数
void on_f(int, void*)
{
Mat element1 = getStructuringElement(MORPH_ELLIPSE, Size(f * 2 + 1, f * 2 + 1));
erode(src, dst2,element1);
imshow("腐蚀图", dst2);
}
int main()
{
double time0 = static_cast(getTickCount());//记录起始时间
namedWindow("原图", WINDOW_FREERATIO);
namedWindow("膨胀图");
namedWindow("腐蚀图");
imshow("原图", src);
//膨胀
createTrackbar("内核值", "膨胀图", &p, 20, on_p);
on_p(p, 0);
//腐蚀
createTrackbar("内核值", "腐蚀图", &f, 20, on_f);
on_f(f, 0);
time0 = ((double)getTickCount() - time0) / getTickFrequency();
cout << "此方法运行时间:" << time0 << "秒" << endl;//输出运行时间
waitKey(0);
return 0;
}



