OpenCV图像腐蚀的学习总结

 

今天对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");


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值