宽度W,高度H 的图像,做膨胀操作,如果膨胀的结构元素structure

element,大小为kw,kh,那么就需要做W*H*kw*kh次运算,运算量比较大。

根据图像形态学的理论,膨胀满足结合律,即

,B和C为结构元素。假设一个结构元素S可以表示为两个结构元素B和C的膨胀,即S=B⊕C,则A⊕S=A⊕(B⊕C)=(A⊕B)⊕C,换言之,用S膨胀A等同于用B先膨胀A,再用C膨胀前面的结果。我们称S能够分解成B和C两个结构元素。结合律很重要,因为计算膨胀所需要的时间正比于结构元素中的非零像素的个数。通过上述推导,分解结构元素,然后再分别用子结构元素进行膨胀操作往往会实现很客观的速度的增长。

同样,腐蚀也可以做结构分解,腐蚀满足公式

,B和C为结构元素,同样如果一个结构元素S可以表示为两个结构元素B和C的膨胀,即S=B⊕C,那么用S腐蚀A等同于用B先腐蚀A,再用C腐蚀前面的结果。公式推导省略。图像形态学膨胀和腐蚀介绍,可见

http://en.wikipedia.org/wiki/Erosion_(morphology)

http://en.wikipedia.org/wiki/Dilation_(morphology)做结构分解后的运算量为W*H*(kw+kh)代码如下

1

#include

<cv.h>2#include

<highgui.h>3#include

<stdio.h>456int

main(int argc, char**

argv)7

{8

if(argc<2)

{9

printf("has no param\n");10

return 0;11

}1213

IplConvKernel *element1 = cvCreateStructuringElementEx( 1,

25, 0,

0,

CV_SHAPE_RECT, 0);14

IplConvKernel *element2 = cvCreateStructuringElementEx( 16,

1, 0,

0,

CV_SHAPE_RECT, 0);15

IplConvKernel *element3 = cvCreateStructuringElementEx( 16,

25, 0,

0,

CV_SHAPE_RECT, 0);16 17

IplImage* src=cvLoadImage(argv[1],1); 18 1920

if( src!=

NULL)21

{22 23

IplImage* img =

cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);24

cvCvtColor(src,img,CV_BGR2GRAY);25

cvReleaseImage(&src);26 27 28

IplImage* tmp =

cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);29

cvDilate( img, tmp, element1, 1);30 31

IplImage* dst1 =

cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 32

cvDilate( tmp, dst1, element2, 1);33 34 35

IplImage* dst2 =

cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 36

cvDilate( img, dst2, element3, 1);37 38

IplImage* diff =

cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 39

cvSub(dst2,dst1,tmp,NULL);40

cvEqualizeHist( tmp, diff);41

cvReleaseImage(&tmp);42 43

int noZeroCount=cvCountNonZero(diff);44

printf("no zerocount %d\n",noZeroCount);45 46 47

cvNamedWindow("img",CV_WINDOW_AUTOSIZE);48

cvShowImage("img",img);49

cvNamedWindow("dst1",CV_WINDOW_AUTOSIZE);50

cvShowImage("dst1",dst1);51

cvNamedWindow("dst2",CV_WINDOW_AUTOSIZE);52

cvShowImage("dst2",dst2);53

cvNamedWindow("diff",CV_WINDOW_AUTOSIZE);54

cvShowImage("diff",diff);55 56 57

cvWaitKey();58

cvDestroyAllWindows();59 60 61

cvReleaseImage(&img);62

cvReleaseImage(&dst1);63

cvReleaseImage(&dst2);64

cvReleaseImage(&diff);65 66

cvReleaseStructuringElement(&element1);67

cvReleaseStructuringElement(&element2);68

cvReleaseStructuringElement(&element3);69 70 71 72 73 74

}75

else76

{77

printf("error,not load\n");78

}79

return 0;80};81

在OpenCV中,定义了一个结构用于描述形态学中的结构元素。该结构定义如下:

typedef struct _IplConvKernel

{

int nCols;

int nRows;

int anchorX;

int anchorY;

int *values;

int nShiftR;

}

IplConvKernel;

在这里,对其中的变量定义做一简单的描述:

nCols,nRows:结构元素的行宽与列高;

anchorX,anchorY:结构元素原点(锚点)的位置坐标,水平,垂直;

nShiftR:用于表示结构元素的形状类型,有如下几个值:

#define CV_SHAPE_RECT 0

#define CV_SHAPE_CROSS 1

#define CV_SHAPE_ELLIPSE 2

#define CV_SHAPE_CUSTOM 100

分别表示矩形,十字,椭圆和自定义。

values:当nShiftR为自定义时,value是指向结构元素数据的指针,如果结构元素的大小定义为8*6,那么values为48长的int数组,值为0或1。

在OpenCV中定义了两个关于结构元素IplConvKernel的操作,用于结构元素的创建和释放。

cvCreateStructuringElementEx

创建结构元素

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 时才予以考虑)。

函数 cv CreateStructuringElementEx 分配和填充结构 IplConvKernel,

它可作为形态操作中的结构元素。

cvReleaseStructuringElement

删除结构元素

void cvReleaseStructuringElement( IplConvKernel** element );

element 被删除的结构元素的指针

函数 cvReleaseStructuringElement 释放结构 IplConvKernel 。如果 *element 为

NULL, 则函数不作用。

其他结构元素的扩展操作参见:

matlab 膨胀 结构元,图像形态学膨胀 结构元素相关推荐

  1. 图像形态学操作—腐蚀膨胀深入

    博客原创出处:http://blog.csdn.net/lu597203933/article/details/36222277 这里我们主要想讲解冈萨雷斯的数字图像处理这本书上膨胀腐蚀的定义及用op ...

  2. 图像形态学处理(3)

    接上篇图像形态学处理(2) 2. 灰度级图像形态学 灰度级图像形态学适用于这两种情形:应用希望保留图像灰度阶.需要在二值化前做预处理以突出某些特征 2.1 基础操作 1)腐蚀 灰度级的结构元较二值结构 ...

  3. matlab设置非平坦结构元,基于多尺度多结构元的数学形态学边缘检测

    田国富,宋江波 (沈阳工业大学 机械工程学院,辽宁 沈阳 110870) 摘要: 针对传统的边缘检测算子对噪声敏感问题,提出了一种基于多尺度多结构元素形态学边缘检测算子.该算子在传统形态学边缘检测的基 ...

  4. 【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)

    转载博客请注明详细地址,谢谢 本文讲了形态学基本操作膨胀腐蚀开闭操作的原理 本文讲解了用OpenCV-Python实现形态学操作 目录 一.形态学简述 1.简介 2.一些基本定义 3.结构元素 (1) ...

  5. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  6. 图像形态学概要-腐蚀、膨胀、开运算、闭运算、形态学梯度(形态学边缘提取)、顶帽操作、黑帽操作

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像形态学中两种最基本的操作就是对图形的腐蚀和膨 ...

  7. opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽

    Morphological Transformations 1图像腐蚀 腐蚀的基本思想:侵蚀前景物体的边界(总是试图保持前景为白色):内核在图像中滑动(如在2D卷积中).只有当内核下的所有像素都是1时 ...

  8. OpenCV3学习(4.3)——图像形态学(膨胀,腐蚀)

    在图像处理技术中,有一些的操作会对图像的形态发生改变,这些操作一般称之为形态学操作(phology).数学形态学是基于集合论的图像处理方法,最早出现在生物学的形态与结构中,图像处理中的形态学操作用于图 ...

  9. matlab 图像的膨胀indilate和腐蚀imerode

    1.图像膨胀的Matlab实现: 可以使用imdilate函数进行图像膨胀,imdilate函数需要两个基本输入参数,即待处理的输入图像和结构元素对象.结构元素对象可以是strel函数返回的对象,也可 ...

最新文章

  1. Android toolbar menu 字体点击样式
  2. String长度有限制吗?是多少?还好我看过
  3. NTU课程笔记 MAS714(8) 分治与排序
  4. CentOS6.9 下编译安装MySQL5.7.19
  5. php文件显示不完整,github文件显示不全
  6. 获得驱动器信息卷设备Ring3得到磁盘文件系统(NTFS WIN10)
  7. ZOJ 2412 Farm Irrigation
  8. 数字信号处理(matlab)——FFT对信号频谱分析
  9. 教育网系统服务器域名地址,教育网宽带dns服务器IP地址(2021年更新)
  10. 带你近距离了解小米这家公司
  11. 把百度首页放到博客里看看
  12. 青果教务管理系统存储型XSS 一枚
  13. 红黑树高度上限的证明(通俗易懂)
  14. zk实现主从选举-java
  15. opencv 图像人物识别
  16. 【效率办公】推荐一款非常好用的电脑桌面便签
  17. Carson带你学Android:RxJava过滤操作符
  18. 数据结构例1.已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素
  19. [新人必读]独立游戏能否通过宣传视频众筹募集启动资金投石问路
  20. 怎样把xp计算机语言改为英文,xp系统电脑语言改成英文的恢复步骤

热门文章

  1. python爬虫,虎牙房间爬取(selenium)
  2. 华为P40或将搭载鸿蒙,厉害了任正菲的华为:P40或将搭载鸿蒙系统很快就要上市了...
  3. 模型优化-梯度下降算法
  4. 1.3 C++常量 (Constants )
  5. Acrobat Pro DC 教程:了解 Acrobat Pro DC 界面
  6. pytorch 深度学习补充
  7. 域名注册,选择注册商的安全重要性
  8. 嵌入式面试常见问题(二)
  9. 步进电机与伺服电机对比
  10. Pair Project