形态学变换

原文:http://blog.sina.com.cn/s/blog_790bb7190100qgwq.html 与http://blog.sina.com.cn/s/blog_47522f7f0100j9j3.html

记录一下cvCreateStructuringElementEx()和cvMorphologyEx()两个函数

1、cvCreateStructuringElementEx()该函数创建结构元素
1)函数原型:

IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y,
int shape, int* values=NULL );

2)参数说明
cols :结构元素的列数目
rows :结构元素的行数目
anchor_x :锚点的相对水平偏移量
anchor_y :锚点的相对垂直偏移量
shape :结构元素的形状,可以是下列值: 
    CV_SHAPE_RECT, 长方形元素; 
    CV_SHAPE_CROSS, 交错元素 a cross-shaped element; 
    CV_SHAPE_ELLIPSE, 椭圆元素; 
    CV_SHAPE_CUSTOM, 用户自定义元素。这种情况下参数 values 定义了 mask,即象素的那个邻域必须考虑。
values 指向结构元素的指针,它是一个平面数组,表示对元素矩阵逐行扫描。(非零点表示该点属于结构元)。如果指针为空,则表示平面数组中的所有元素都是非零的,即结构元是一个长方形(该参数仅仅当shape参数是 CV_SHAPE_CUSTOM 时才予以考虑)。
   函数 cv CreateStructuringElementEx 分配和填充结构 IplConvKernel, 它可作为形态操作中的结构元素。

2、cvMorphologyEx()该函数实现高级形态学变换。
1)函数原型:
void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp,IplConvKernel* element, int operation, int iterations=1 );

2)参数说明:
src 输入图像.
dst 输出图像.
temp 临时图像,某些情况下需要
element 结构元素
operation 形态操作的类型: CV_MOP_OPEN - 开运算   CV_MOP_CLOSE - 闭运算 CV_MOP_GRADIENT - 形态梯度 
                         CV_MOP_TOPHAT - "顶帽"  CV_MOP_BLACKHAT - "黑帽"
iterations 膨胀和腐蚀次数.
函数 cvMorphologyEx 在膨胀和腐蚀基本操作的基础上,完成一些高级的形态变换:
     开运算:dst=open(src,element)=dilate(erode(src,element),element)
     闭运算:dst=close(src,element)=erode(dilate(src,element),element)
     形态梯度:dst=morph_grad(src,element)=dilate(src,element)-erode(src,element)
     "顶帽":dst=tophat(src,element)=src-open(src,element)
     "黑帽":dst=blackhat(src,element)=close(src,element)-src
     临时图像 temp 在形态梯度以及对“顶帽”和“黑帽”操作时的 in-place 模式下需要。

3、例子

IplConvKernel *element=cvCreateStructuringElementEx(3,1,0.5,0.5,CV_SHAPE_RECT,0);
cvMorphologyEx( src, dst, NULL,element, CV_MOP_CLOSE, 8);

cvMorphologyEx(gray,hat,NULL,CV_SHAPE_RECT,CV_MOP_GRADIENT,1);

 

 

  CreateStructuringElementEx
创建结构元素

IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y,
int shape, int* values=NULL );
cols
结构元素的列数目
rows
结构元素的行数目
anchor_x
锚点的相对水平偏移量
anchor_y
锚点的相对垂直偏移量
shape
结构元素的形状,可以是下列值:
CV_SHAPE_RECT, 长方形元素;
CV_SHAPE_CROSS, 交错元素 a cross-shaped element;
CV_SHAPE_ELLIPSE, 椭圆元素;
CV_SHAPE_CUSTOM, 用户自定义元素。这种情况下参数 values 定义了 mask,即象素的那个邻域必须考虑。
values
指向结构元素的指针,它是一个平面数组,表示对元素矩阵逐行扫描。(非零点表示该点属于结构元)。如果指针为空,则表示平面数组中的所有元素都是非零的,即结构元是一个长方形(该参数仅仅当shape参数是 CV_SHAPE_CUSTOM 时才予以考虑,即当用户自定义元神时才不为0,一般都为0)。
函数 cv CreateStructuringElementEx 分配和填充结构 IplConvKernel, 它可作为形态操作中的结构元素。

 

举个例子比较好说清楚
比如一个图
00000
01110
00000
用一个 cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)的元素来腐蚀,则结果为
00000
01000
00000
而用一个 cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)的元素来腐蚀,则结果为
00000
00100
00000
  理解:cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)中的3,1表示要腐蚀的对象是一个3列1行的矩阵,如果该矩阵里元素全为非零,则将其转化为同样大小只包含一个非零元素,而该非零元素的位置是(0,0)。同理cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)中的3,1表示要腐蚀的对象是一个3列1行的矩阵,如果该矩阵里元素全为非零,则将其转化为同样大小只包含一个非零元素,而该非零元素的位置是(1,0)

 
 假如用下面这个去腐蚀图像,中心是在右下角
1 0 0
1 1 0
1 1 1
那么应该怎么表示呢?

 理论上应该是
int mask[9] = {1, 0, 0, 1, 1, 0, 1, 1, 1};
IplConvKernel* strel = cvCreateStructuringElementEx( 3, 3, 0, 2, CV_SHAPE_CUSTOM, mask );其中0,2可按自己要求设置。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值