opencv一些图象处理函数,比如腐蚀cvErode和cvDilate,可以用自己的定制的结构元素进行处理.
IplConvKernel* kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL);
cvErode(cannyImage,cannyImage,0,1);//
cvReleaseStructuringElement( &kernel );
记得用完需要释放空间.因为在函数cvCreateStructuringElementEx里面Alloc了堆空间.
腐蚀用在消除二值图象不相关的细节,膨胀将断裂的区域桥接起来.
cvCreateStructuringElementEx的第三个参数是表示结构元素的形状,不同的形状处理的结果不一样.腐蚀和膨胀的区域也不一样.
下面是函数的源代码解释了这个结构体
switch (shape)
{
case CV_SHAPE_RECT:
memset( vals, -1, sizeof( vals[0] ) * cols * rows );//这里就是矩形,每个元素都是-1
break;
case CV_SHAPE_CROSS://行偏移的位置为anchorY,列的偏移的位置是anchorX
memset( vals, 0, sizeof( vals[0] ) * cols * rows );
for( i = 0; i < cols; i++ )
{
vals[i + anchorY * cols] = -1;
}
for( i = 0; i < rows; i++ )
{
vals[anchorX + i * cols] = -1;
}
break;
case CV_SHAPE_ELLIPSE://椭圆的位置,这个在待分析
{
int r = (rows + 1) / 2;
int c = cols / 2;
double inv_r2 = 1. / (((double) (r)) * (r));
memset( vals, 0, sizeof( vals[0] ) * cols * rows );
for( i = 0; i < r; i++ )
{
int y = r - i;
int dx = cvRound( c * sqrt( ((double)r * r - y * y) * inv_r2 ));
int x1 = c - dx;
int x2 = c + dx;
if( x1 < 0 )
x1 = 0;
if( x2 >= cols )
x2 = cols;
x2 -= x1 - 1;
memset( vals + i * cols + x1, -1, x2 * sizeof( int ));
memset( vals + (rows - i - 1) * cols + x1, -1, x2 * sizeof( int ));
}
}
break;
case CV_SHAPE_CUSTOM://根据values的值填充结构元素
for( i = 0; i < size; i++ )
{
vals[i] = !values || values[i] ? -1 : 0;
}
break;
default:
cvFree( (void**)&element );
CV_ERROR_FROM_STATUS( CV_BADFLAG_ERR );
}