您的位置:首页 > 其它

图像处理之膨胀腐蚀操作

2014-01-23 14:32 190 查看
腐蚀的算法:

用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为1,结果图像的该像素为1。否则为0。

结果:使二值图像减小一圈

B}Í S = { x,y | SxyÄ定义:E = B

膨胀的算法:

用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为0,结果图像的该像素为0。否则为1

结果:使二值图像扩大一圈

S = { x,y | Sxy∩B ≠Ф}Å定义:E = B

void erode_image(IplImage * src,IplImage * dst)
{
if(src == NULL || dst == NULL)
return;

int width = src->width;
int height = src->height;

//水平方向的腐蚀
for (int i=0;i < src->height;i++)
{
for (int j=1;j < src->width - 1;j++)
{
//	data = ((uchar *)(src->imageData + src->widthStep * i))[j];
if(((uchar *)(src->imageData + src->widthStep * i))[j] == 0)
{
((uchar *)(dst->imageData + dst->widthStep * i))[j] = 0;
for (int k=0;k < 3;k++)
{
//	data = ((uchar *)(src->imageData + src->widthStep * i))[j + k -1];
if(((uchar *)(src->imageData + src->widthStep * i))[j + k -1] == 255)
{
((uchar *)(dst->imageData + dst->widthStep * i))[j] = 255;
break;
}
}
}
else
((uchar *)(dst->imageData + dst->widthStep * i))[j] = 255;
}
}
//垂直方向的腐蚀
for (int i=0;i < dst->width;i++)
{
for (int j=1;j < dst->height - 1;j++)
{
//	data = ((uchar *)(src->imageData + src->widthStep * i))[j];
if(((uchar *)(dst->imageData + dst->widthStep * j))[i] == 0)
{
((uchar *)(src->imageData + src->widthStep * j))[i] = 0;
for (int k=0;k < 3;k++)
{
//	data = ((uchar *)(src->imageData + src->widthStep * i))[j + k -1];
if(((uchar *)(dst->imageData + dst->widthStep * (j + k -1)))[i] == 255)
{
((uchar *)(src->imageData + src->widthStep * j))[i] = 255;
break;
}
}
}
else
((uchar *)(src->imageData + src->widthStep * j))[i] = 255;
}
}
}
void dilate_image(IplImage * src,IplImage * dst)
{
if(src == NULL || dst == NULL)
return;

int width = src->width;
int height = src->height;

//水平方向的膨胀
for (int i=0;i < src->height;i++)
{
for (int j=1;j < src->width - 1;j++)
{
if(((uchar *)(src->imageData + src->widthStep * i))[j] == 255)
{
((uchar *)(dst->imageData + dst->widthStep * i))[j] = 255;
for (int k=0;k < 3;k++)
{
if(((uchar *)(src->imageData + src->widthStep * i))[j + k -1] == 0)
{
((uchar *)(dst->imageData + dst->widthStep * i))[j] = 0;
break;
}
}
}
else
((uchar *)(dst->imageData + dst->widthStep * i))[j] = 0;
}
}
//垂直方向的膨胀
for (int i=0;i < dst->width;i++)
{
for (int j=1;j < dst->height - 1;j++)
{
//	data = ((uchar *)(src->imageData + src->widthStep * i))[j];
if(((uchar *)(dst->imageData + dst->widthStep * j))[i] == 255)
{
((uchar *)(src->imageData + src->widthStep * j))[i] = 255;
for (int k=0;k < 3;k++)
{
//	data = ((uchar *)(src->imageData + src->widthStep * i))[j + k -1];
if(((uchar *)(dst->imageData + dst->widthStep * (j + k -1)))[i] == 0)
{
((uchar *)(src->imageData + src->widthStep * j))[i] = 0;
break;
}
}
}
else
((uchar *)(src->imageData + src->widthStep * j))[i] = 0;
}
}
}
image = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE);
dst1 = cvCreateImage(cvSize(image->width,image->height),image->depth,image->nChannels);

dilate_image(image,dst1);
erode_image(image,dst1);

cvSaveImage(str,image);


原图



结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐