今天对OpenCV 中的图像腐蚀进行了学习,现在总结如下,图片来源 :www.opencvchina.com其中源代码在后面,调试通过(在VS2010 + OpenCV 2.4.3 下)
概念理解:
1、结构元素
设有两幅图象B,X。若 X 是被处理的对象,而B 是用来处理X 的,则称B 为结构元素(structure element),
又被形象地称做刷子。结构元素通常都是一些比较小的图象。
2、锚点
可以理解为结构元素中不变的点,以该点为中心进行滑动腐蚀,如下图中的中心点(0,0)
3、腐蚀
把结构元素B 平移a 后得到B a ,若Ba 包含于X,我们记下这个a 点,所有满足上述条件的a 点组成的集合
称做X 被B 腐蚀(Erosion)的结果。用公式表示为:E(X)={a| Ba X}=X B,,如下图所示:
介绍一下OPenCV中的关于图像腐蚀用到的一些函数或结构体等。
1)、CVAPI(void) cvSetReal2D( CvArr* arr, int idx0, int idx1, double value );
在坐标(idx0,idx1)处设定值value,可用于对源图像中的点设值,
2)、 IplConvKernel * element =0;声明结构元素变量
3)、/* creates structuring element used for morphological operations */ 创建结构元素
CVAPI(IplConvKernel*) cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int* values CV_DEFAULT(NULL) );
cols:结构元素的列数;rows:结构元素的行数;(anchor_x,anchor_y)锚点坐标;shape:结构元素的形状;values 结构元素的赋值,如values[16]={0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0}, 如cols=4,rows=4, anchor_x=2, int anchor_y=2,
则结构元素为 { 0 , 0 , 0 , 0 ,
0 , 1 , 1 , 0,
0 , 0 , 1 , 0,
0 , 0 , 0 , 0 ,
} 其中 红色的 1 表示 锚点,
4)、腐蚀
CVAPI(void) cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element CV_DEFAULT(NULL), int iterations CV_DEFAULT(1) );
cvErode(src,dst,element,1); //src 表示待腐蚀图像,dst表示腐蚀后的目标图像,element表示 结构元素 ,1 表示腐蚀次数为1次;
。
结果:
代码:
// Test.cpp : 定义控制台应用程序的入口点。//
/*
*
*本程序 由www.opencvchina.com编写
*如若转载 请注明 出自 www.opencvcina.com
*/
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
int main(int argc, char* argv[])
{
#if 1
//创建原图像
IplImage* src=cvCreateImage(cvSize(11,10),8,1);
//创建图像 用于保存腐蚀的结果
IplImage* dst = cvCreateImage(cvGetSize(src),8,1);
//将图像清零
cvZero(dst);
cvZero(src);
//下面的代码 是将 源图像赋初始值
int x,y;
//(1,6)-->(1,9)
//(2,6)-->(2,9)
//(3,6)-->(3,9)
for( y=1;y<4;y++)
{
for(x=6;x<10;x++)
{
cvSetReal2D(src,y,x,255); //CVAPI(void) cvSetReal2D( CvArr* arr, int idx0, int idx1, double value ); 在坐标为(x,y)处设定值
}
}
//(4,4)-->(4,7)
//(5,4)-->(4,7)
for(y=4;y<6;y++)
{
for(x=4;x<8;x++)
{
cvSetReal2D(src,y,x,255);
}
}
//(6,1)-->(6,7)
for(x=1;x<8;x++)
{
cvSetReal2D(src,6,x,255);
}
//(7,1)-->(7,4)
//(8,1)-->(8,4)
for(y=7;y<9;y++)
{
for(x=1;x<5;x++)
{
cvSetReal2D(src,y,x,255);
}
}
/*
cvSetReal2D(src,0,0,1);
cvSetReal2D(src,0,1,2);
cvSetReal2D(src,1,0,3);
cvSetReal2D(src,1,2,4);
*/
//输出源图像
printf("src is \n");
for(y=0;y<src->height;y++)
{
for(x=0;x<src->width;x++)
{
float value = cvGetReal2D(src,y,x);
printf("%3d ",(int)(value));
}
printf("\n");
}
//声明结构元素变量
IplConvKernel * element =0;
//结构元素的取值情况
int values[16]={ 0,0,0,0,
0,0,1,0,
0,1,1,0,
0,0,0,0
};
//声明结构元素的列数 行数 锚点坐标
int cols =4 ,rows = 4 , anchor_x = 2 ,anchor_y =2;
//创建结构元素
element = cvCreateStructuringElementEx(cols,rows,anchor_x,anchor_y,CV_SHAPE_CUSTOM,values);
//使用自定义结构元素 对图像进行腐蚀
cvErode(src,dst,element,1);
//输出腐蚀的结果
printf("dst is \n");
for(y=0;y<dst->height;y++)
{
for(x=0;x<dst->width;x++)
{
float value = cvGetReal2D(dst,y,x);
printf("%3d ",(int)(value));
}
printf("\n");
}
#endif
system("pause");
}