【OpenCV学习】图像的形态处理学

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

/*******************************
数学形态运算,最常见的基本运算有七种,
分别为:腐蚀、膨胀、开运算、闭运算、击中、细化和粗化,
它们是全部形态学的基础。
********************************/
#include "cv.h"
#include "highgui.h"
#include <stdlib.h>
#include <stdio.h>
IplImage *src=/blog.armyourlife.info/0;
IplImage *dst=0;
IplConvKernel *element=0;//声明一个结构元素
int element_shape=CV_SHAPE_RECT;//长方形形状的元素
int max_iters=10;
int open_close_pos=0;
int erode_dilate_pos=0;
void OpenClose(int pos)
{
    int n=open_close_pos-max_iters;
    int an=n>0?n:-n;
    element = cvCreateStructuringElementEx(an*2+1,
    an*2+1,an,an,element_shape,0);//创建结构元素
   
    if (n<0)
    {
        cvErode(src,dst,element,1);//腐蚀图像
        cvDilate(dst,dst,element,1);//膨胀图像
    }
    else
    {       
        cvDilate(dst,dst,element,1);//膨胀图像
        cvErode(src,dst,element,1);//腐蚀图像
    }
    cvReleaseStructuringElement(&element);
    cvShowImage("Open/Close",dst);
}
void ErodeDilate(int pos)
{
    int n=erode_dilate_pos-max_iters;
    int an=n>0?n:-n;
    element = cvCreateStructuringElementEx(an*2+1,an*2+1,an,an,element_shape,0);
    if (n<0)
    {
        cvErode(src,dst,element,1);
    }
    else
    {
        cvDilate(src,dst,element,1);
    }
    cvReleaseStructuringElement(&element);
    cvShowImage("Erode/Dilate",dst);
}
int main(int argc,char **argv)
{
    char *filename =argc ==2?argv[1]:(char *)"lena.jpg";   
    if( (src = /blog.armyourlife.info/cvLoadImage(filename,1)) == 0 )
        return -1;
    dst=cvCloneImage(src);
    cvNamedWindow("Open/Close",1);
    cvNamedWindow("Erode/Dilate",1);
    open_close_pos = erode_dilate_pos = max_iters;
    cvCreateTrackbar("iterations","Open/Close",&open_close_pos,max_iters*2+1,OpenClose);
    cvCreateTrackbar("iterations","Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);
    for (;;)
    {
        int c;
        OpenClose(open_close_pos);
        ErodeDilate(erode_dilate_pos);
        c= cvWaitKey(0);
        if (c==27)
        {
            break;
        }
        switch(c) {
        case 'e':
            element_shape=CV_SHAPE_ELLIPSE;
            break;
        case 'r':
            element_shape=CV_SHAPE_RECT;
            break;
        case '/r':
            element_shape=(element_shape+1)%3;
            break;
        default:
            break;
        }
    }
    cvReleaseImage(&src);
    cvReleaseImage(&dst);
   
    cvDestroyWindow("Open/Close");
    cvDestroyWindow("Erode/Dilate");
    return 0;
}
/*****************************
腐蚀和膨胀,看上去好像是一对互逆的操作,实际上,这两种操作不具有互逆的关系。
开运算和闭运算正是依据腐蚀和膨胀的不可逆性,演变而来的。
先腐蚀后膨胀的过程就称为开运算。
闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的,
闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界,
同时不明显改变不明显改变其面积。
******************************/

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

posted @ 2012-10-13 21:25  gnuhpc  阅读(2137)  评论(0编辑  收藏  举报