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

/*******************************
数学形态运算,最常见的基本运算有七种,
分别为:腐蚀、膨胀、开运算、闭运算、击中、细化和粗化,
它们是全部形态学的基础。
********************************/
#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;
}
/*****************************
腐蚀和膨胀,看上去好像是一对互逆的操作,实际上,这两种操作不具有互逆的关系。
开运算和闭运算正是依据腐蚀和膨胀的不可逆性,演变而来的。
先腐蚀后膨胀的过程就称为开运算。
闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的,
闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界,
同时不明显改变不明显改变其面积。
******************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源计算机视觉库,可以进行图像处理图像分析和机器视觉等方面的开发。其中,图像形态处理OpenCV中的一种基本图像处理技术,主要用于图像形态分析和形态变换。 图像形态处理主要包括以下几个基本操作: 1. 腐蚀(Erosion):将图像中的物体边界向内侵蚀,可以去除细小的噪点和连接物体之间的小桥梁。 2. 膨胀(Dilation):将图像中的物体边界向外膨胀,可以填充物体内的空洞和连接相邻物体。 3. 开运算(Opening):先对图像进行腐蚀操作,再对腐蚀后的图像进行膨胀操作,可以去除细小的物体和连接物体之间的小桥梁。 4. 闭运算(Closing):先对图像进行膨胀操作,再对膨胀后的图像进行腐蚀操作,可以填充物体内的空洞和连接相邻物体。 5. 梯度(Gradient):通过对图像进行膨胀和腐蚀操作,可以得到物体的边缘信息。 6. 礼帽(Top Hat):通过对原图像和开运算后的图像进行相减操作,可以得到原图像中小物体和较暗的区域信息。 7. 黑帽(Black Hat):通过对原图像和闭运算后的图像进行相减操作,可以得到原图像中小物体和较亮的区域信息。 这些操作可以通过OpenCV中的函数进行实现,例如: cv2.erode():进行腐蚀操作 cv2.dilate():进行膨胀操作 cv2.morphologyEx():进行开闭运算、梯度、礼帽和黑帽操作 在实际应用中,图像形态处理常用于图像分割、形状分析、边缘检测、物体识别等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值