opencv图像形态学处理

部分内容转至http://blog.csdn.net/welcome_xu/article/details/6694985

1:图像的形态学处理:

膨胀、腐蚀、开、闭运算是数学形态学最基本的变换,用得最多的主要是针对二值图像的形态学
膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔);
腐蚀:把二值图像各1像素连接成分的边界点去掉从而缩小一层(可提取骨干信息,去掉毛刺,去掉孤立的0像素);
开:先腐蚀再膨胀,可以去掉目标外的孤立点
闭:先膨胀再腐蚀,可以去掉目标内的孔。

首先看一下opencv中自带的函数:

腐蚀:

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor=Point(-1,-1), int iterations=1,
                         int borderType=BORDER_CONSTANT,
                         const Scalar& borderValue=morphologyDefaultBorderValue() );

其中,src为输入的图像,一般为二值图像也可以是灰度图像,dst为输出图像,和src可以是同一个变量,kennels为结构元素,默认的话为一个3×3的矩阵, anchor:结构元素的中心,如果是默认参数(-1,-1),程序会自动将其设置为结构元素的中心。

iterations:迭代次数,我们可以选择对图像进行多次形态学运算。后面两个参数是边界类型,由于要处理领域问题,所以图像需要扩充边界。一般情况下使用默认即可。

膨胀:

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor=Point(-1,-1), int iterations=1,
                          int borderType=BORDER_CONSTANT,
                          const Scalar& borderValue=morphologyDefaultBorderValue() );

参数和上边一样;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat image = imread("003.jpg",1);
	cvtColor(image,image,CV_RGB2GRAY);
	threshold(image,image,65,255,THRESH_BINARY);
	namedWindow("原图");
	imshow("原图",image);

	Mat eroded;
	erode(image,eroded,Mat());
	namedWindow("腐蚀");
	imshow("腐蚀",eroded);

	Mat dilated;
	dilate(image,dilated,Mat());
	namedWindow("膨胀");
	imshow("膨胀",dilated);
	
	waitKey(0);
	return 0;
}

原二值图像和腐蚀膨胀后的结果如下图:

  


2:开运算与闭运算

CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor=Point(-1,-1), int iterations=1,
                                int borderType=BORDER_CONSTANT,
                                const Scalar& borderValue=morphologyDefaultBorderValue() );

可以看到参数与腐蚀膨胀运算差不多,就是第三个参数op不一样。op为MORPH_CLOSE,表示闭运算。MORPH_OPEN表示开运算;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat image = imread("003.jpg",1);
	cvtColor(image,image,CV_RGB2GRAY);
	threshold(image,image,65,255,THRESH_BINARY);
	namedWindow("原图");
	imshow("原图",image);

	Mat element(5,5,CV_8U,Scalar(1));
	Mat closed;
	morphologyEx(image,closed,MORPH_CLOSE,element);
	namedWindow("closed");
	imshow("closed",closed);

	Mat opened;
	morphologyEx(image,opened,MORPH_OPEN,element);
	namedWindow("opened");
	imshow("opened",opened);

	waitKey(0);
	return 0;
}

得到的结果:

   

图像的形态学操作主要用于:边缘检测、图像分割、形态骨架提取、噪声滤除。
选取结构元素的方法:多结构元素、遗传算法。







猜你喜欢

转载自blog.csdn.net/zhang_alongzd/article/details/51585902