Erode腐蚀,Dilate膨胀,这两个形态学函数总是成对出现,前者可以消除较小独点如噪音,后者可以使不连通的图像合并成块。
void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 )
void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
这两个函数的参数相同,是一对“相反”的函数(这里的相反并不是指后一个函数可以将前一个函数处理的图像恢复,而是一个缩小图像团块,一个放大图像的团块)
src
输入图像.
dst
输出图像.
element
用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations
膨胀的次数
膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。
下面的程序将演示这两个函数,腐蚀和膨胀的过程
- <code class=“language-cpp”>#include “cv.h”
- #include “cxcore.h”
- #include “highgui.h”
- int main(int argc,char** argv)
- {
- if(argc<2)
- return 0;
- int a=1;
- int eIter=1,dIter=1,exitFlag=1;
- IplImage *image,*image1,*image2;
- image = cvLoadImage(argv[1]);
- image1 = cvCreateImage(cvSize(image->width,image->height),8,1);
- image2 = cvCreateImage(cvSize(image->width,image->height),8,1);
- cvCvtColor(image,image1,CV_RGB2GRAY);
- cvCvtColor(image,image2,CV_RGB2GRAY);
- cvNamedWindow(”image”,1);
- cvShowImage(”image”,image);
- cvNamedWindow(”Select”,1);
- cvCreateTrackbar(”eIterations”,“Select”,&eIter,20,0);
- cvCreateTrackbar(”dIterations”,“Select”,&dIter,20,0);
- cvNamedWindow(”Erode”,1);
- cvNamedWindow(”Dilate”,1);
- cvShowImage(”Erode”,image1);
- cvShowImage(”Dilate”,image2);
- cvWaitKey(0);
- while(1)
- {
- //腐蚀,消除细小物质
- cvErode(image1,image1,0,2);
- cvShowImage(”Erode”,image1);
- std::cout<<”Erode”<<std::endl;
- a=cvWaitKey(0);
- if((char) a == ‘q’)
- break;
- }
- cvCopy(image1,image2);
- a=1;
- while(1)
- {
- //腐蚀,填充物体内细小物质
- cvDilate(image2,image2,0,1);
- cvShowImage(”Dilate”,image2);
- std::cout<<”Dilate”<<std::endl;
- a=cvWaitKey(0);
- if((char) a == ‘q’)
- break;
- }
- return 0;
- }</code>
-
#include "cv.h"
-
#include "cxcore.h"
-
#include "highgui.h"
-
int main(int argc,char** argv)
-
{
-
if(argc<
2)
-
return
0;
-
int a=
1;
-
int eIter=
1,dIter=
1,exitFlag=
1;
-
IplImage *image,*image1,*image2;
-
image = cvLoadImage(argv[
1]);
-
image1 = cvCreateImage(cvSize(image->width,image->height),
8,
1);
-
image2 = cvCreateImage(cvSize(image->width,image->height),
8,
1);
-
-
cvCvtColor(image,image1,CV_RGB2GRAY);
-
cvCvtColor(image,image2,CV_RGB2GRAY);
-
cvNamedWindow(
"image",
1);
-
cvShowImage(
"image",image);
-
-
cvNamedWindow(
"Select",
1);
-
cvCreateTrackbar(
"eIterations",
"Select",&eIter,
20,
0);
-
cvCreateTrackbar(
"dIterations",
"Select",&dIter,
20,
0);
-
cvNamedWindow(
"Erode",
1);
-
cvNamedWindow(
"Dilate",
1);
-
cvShowImage(
"Erode",image1);
-
cvShowImage(
"Dilate",image2);
-
cvWaitKey(
0);
-
-
while(
1)
-
{
-
//腐蚀,消除细小物质
-
cvErode(image1,image1,
0,
2);
-
-
cvShowImage(
"Erode",image1);
-
std::
cout<<
"Erode"<<
std::
endl;
-
-
a=cvWaitKey(
0);
-
if((
char) a ==
'q')
-
break;
-
}
-
-
cvCopy(image1,image2);
-
a=
1;
-
while(
1)
-
{
-
//腐蚀,填充物体内细小物质
-
cvDilate(image2,image2,
0,
1);
-
-
cvShowImage(
"Dilate",image2);
-
std::
cout<<
"Dilate"<<
std::
endl;
-
-
a=cvWaitKey(
0);
-
-
if((
char) a ==
'q')
-
break;
-
}
-
return
0;
-
}
这个程序可以选择迭代次数为1,然后不断循环(可以作为迭代次数),观察每次迭代后的效果。
效果:
下面是实验效果(原图是在车辆跟踪中用帧间差分法得到的二值化图像),可以发现通过先腐蚀Erode多次,后膨胀Dilate多次,图像的噪音消除,物体内细小物质也被填充。
第一幅图右边为原图,左边为腐蚀后消除了噪音点和干扰点的图。
第二幅图右边是和第一幅图一样的原图,但是左边的图像是对第一幅图像左边的图进行了膨胀操作,可以看到, 物体内细小物质被填充。
通过这样的多次迭代腐蚀再膨胀的过程,可以得到效果更好的检测图像,方便后续提取运动目标操作。