首页 > 技术文章 > 腐蚀图像

-chx 2016-03-28 19:47 原文

1、可以通过腐蚀图像过滤掉一些噪声

2、两幅图像B、X

 (1)、B击中X:存在这样一个点,它既是B的有一个元素,又是X的元素,则B击中X。即B和X至少公共元素

   (2)、结构元素:X是被处理的对象,而B是用来处理X的,则B就是结构元素,也叫作刷子

 (3)、把B中所有元素的坐标,(x,y)取反,这些取反后的点构成新的集合称为B的对象集Bv

3、每个结构元素都有一个中心点,该中心点又称为锚点

4、腐蚀的过程:拿结构B的锚点在X上面逐像素点的滑动,如果滑到某一点,使得B包含于X,则这个点就保留下来

5、代码:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

int main(int argc, char* argv[])
{
IplImage* src=cvCreateImage(cvSize(11,10),8,1);
IplImage* dst=cvCreateImage(cvGetSize(src),8,1);

for(int y1=0;y1<src->height;y1++)
for(int x1=0;x1<src->width;x1++)
cvSetReal2D(src,y1,x1,0);

for(int x=1;x<4;x++)
for(int y=6;y<10;y++)
cvSetReal2D(src,x,y,255);

for(int i=4;i<6;i++)
for(int j=4;j<8;j++)
cvSetReal2D(src,i,j,255);

for(int k=1;k<8;k++)
cvSetReal2D(src,6,k,255);

for(int m=7;m<9;m++)
for(int n=1;n<5;n++)
cvSetReal2D(src,m,n,255);

printf("原图像是:\n");
for(int yy=0;yy<src->height;yy++)
{
for(int xx=0;xx<src->width;xx++)
{
float value=cvGetReal2D(src,yy,xx);
printf("%3d ",(int)value);
}
printf("\n");
}

IplConvKernel* element; //结构元素
int cols=4; //列
int rows=4; //行
int anchor_x=2; //锚点横坐标
int anchor_y=2; //锚点纵坐标
int value[]={0,0,0,0,
0,0,1,0,
0,1,1,0,
0,0,0,0};
element=cvCreateStructuringElementEx(cols,rows,anchor_x,anchor_y,CV_SHAPE_CUSTOM,value); //创建一个结构元素
cvErode(src,dst,element,1);    //腐蚀图像

printf("腐蚀后的图像是:\n");
for(int yy1=0;yy1<dst->height;yy1++)
{
for(int xx1=0;xx1<dst->width;xx1++)
{
float values=cvGetReal2D(dst,yy1,xx1);
printf("%3d ",(int)values);
}
printf("\n");
}

return 0;
}

关键函数分析:

(1)、创建一个结构元素: IplConvKernel* cvCreateStructuringElementEx(int cols,int rows,int anchor_x,int anchor_y,int shape,int* value); 

   cols:结构元素的列数 

     rows:结构元素的行数  

     anchor_x:锚点的横坐标 

   anchor_y:锚点的纵坐标  

   shape:结构元素的形状,当值为CV_SHAPE_CUSTOM或100时,则表示结构元素的形状是自己定义的 

   value:数组,用于存储结构元素里的每一个点,当该点必须被考虑时,用1或>0的数表示,该点不被考虑时,用0表示

(2)、用结构元素去腐蚀图像:cvErode(const CvArr* src,CvArr* dst,IplConvKernel* element,int iterations); 

   src是原图像,dst是结果图像, element是结构元素,iterations是腐蚀的次数

推荐阅读