zoukankan      html  css  js  c++  java
  • 【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/


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    领域驱动设计,让程序员心中有码(五)
    Surging1.0发布在即,.NET开发者们,你们还在等什么?
    年终总结,我为什么离开舒适区?
    领域驱动设计,让程序员心中有码(四)
    领域驱动设计,让程序员心中有码(三)
    领域驱动设计,让程序员心中有码(二)
    领域驱动设计,让程序员心中有码(一)
    传统软件企业之殇
    基于.NET框架的消息通信组件ZMQ资料汇编-总目录
    长沙IT二十年
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2722892.html
Copyright © 2011-2022 走看看