腐蚀函数cvErode 和 膨胀函数cvDilate

    Erode腐蚀, Dilate膨胀,这两个形态学函数总是成对出现,前者可以消除较小的点如噪音,后者可以使不连通的图像合并成块。

void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
      这两个函数的参数相同,是一对“相反”的函数(这里的相反并不是指后一个函数可以将前一个函数处理的图像恢复,而是一个缩小图像团块,一个放大图像的团块)
    src  输入图像.
    dst  输出图像.
    element  用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
    iterations  膨胀的次数。 膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。
    下面的程序将演示这两个函数,腐蚀和膨胀的过程


#include<iostream>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  


#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main(int argc, char** argv)
{
	if (argc<2)
		return 0;//检查输入参数
	int a = 1;
	int eIter = 1, dIter = 1, exitFlag = 1;
	IplImage *image, *image1, *image2;
	image = cvLoadImage(argv[1]);
	image1 = cvCreateImage(cvSize(image->width, image->height), 8, 1);//创建首地址并分配存储空间
	image2 = cvCreateImage(cvSize(image->width, image->height), 8, 1);

	cvCvtColor(image, image1, CV_RGB2GRAY);//实现RGB颜色向HSV,HSI等颜色空间的转换. 参数CV_RGB2GRAY是RGB到gray(灰度图)c参数 CV_GRAY2RGB是gray到RGB.
	cvCvtColor(image, image2, CV_RGB2GRAY);
	cvNamedWindow("image", 1);
	cvShowImage("image", image);
	/* 对话框未使用
	cvNamedWindow("Select", 1);
	cvCreateTrackbar("eIterations", "Select", &eIter, 20, 0); 
	//参数1滑块名称  参数2显示窗口  参数3 OPENCV将当前滑块位置值传给指针指向的整数   参数4滑块调整范围最大值  参数5指向回调函数的指针,当滑动条被拖动时,函数自动调用  

	cvCreateTrackbar("dIterations", "Select", &dIter, 20, 0);
	//参数1滑块名称  参数2显示窗口  参数3 OPENCV将当前滑块位置值传给指针指向的整数   参数4滑块调整范围最大值  参数5指向回调函数的指针,当滑动条被拖动时,函数自动调用
	*/
	cvNamedWindow("Erode_fushi", 1);
	cvNamedWindow("Dilate_pengzhang", 1);
	cvShowImage("Erode_fushi", image1);
	cvShowImage("Dilate_pengzhang", image2);
	cvWaitKey(0);

	while (1)
	{
		cvErode(image1, image1, 0, 1);		
		/*
		cvErode
		腐蚀,消除细小物质
		src  输入图像.
		dst  输出图像.
		element   用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
        iterations   腐蚀的次数.  腐蚀可以重复进行(iterations) 次.对彩色图像,每个彩色通道单独处理。
		*/
		cvShowImage("Erode_fushi", image1);
		std::cout << "Erode_fushi" << std::endl;
		a = cvWaitKey(0);
		if ((char)a == 'q')
			break;
	}
	cvCopy(image1, image2);
	a = 1;

	while (1)
	{
		cvDilate(image2, image2, 0, 1);		//膨胀,填充物体内细小物质
		/*
		cvDilate
		膨胀,消除细小物质
		src  输入图像.
		dst  输出图像.
		element   用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
		iterations   膨胀的次数.  膨胀可以重复进行(iterations) 次.对彩色图像,每个彩色通道单独处理。
		*/
		cvShowImage("Dilate_pengzhang", image2);
		std::cout << "Dilate_pengzhang" << std::endl;
		a = cvWaitKey(0);
		if ((char)a == 'q')
			break;
	}

	//释放窗口资源
	return 0;
}

原图:


腐蚀:

膨胀:




一   引言
       数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处理领域,并研制了基于数学形态学的图像处理系统。1982年出版的专著《ImageAnalysis and MathematicalMorphology》是数学形态学发展的重要里程碑,表明数学形态学在理论上趋于完备及应用上不断深入。数学形态学蓬勃发展,由于其并行快速,易于硬件实现,已引起了人们的广泛关注。目前,数学形态学已在计算机视觉、信号处理与图像分析、模式识别、计算方法与数据处理等方面得到了极为广泛的应用。
       数学形态学可以用来解决抑制噪声、特征提取、边缘检测、图像分割、形状识别、纹理分析、图像恢复与重建、图像压缩等图像处理问题。该文将主要对数学形态学的基本理论及其在图像处理中的应用进行综述。

二   数学形态学的定义和分类
       数学形态学是以形态结构元素为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。数学形态学的基本运算有4个:膨胀、腐蚀、开启和闭合。它们在二值图像中和灰度图像中各有特点。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。

(1)二值形态学
       数学形态学中二值图像的形态变换是一种针对集合的处理过程。其形态算子的实质是表达物体或形状的集合与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算。
       基本的形态运算是腐蚀和膨胀。
       在形态学中,结构元素是最重要最基本的概念。结构元素在形态变换中的作用相当于信号处理中的“滤波窗口”。用B(x)代表结构元素,对工作空间E中的每一点x,腐蚀和膨胀的定义为:
       
       用B(x)对E进行腐蚀的结果就是把结构元素B平移后使B包含于E的所有点构成的集合。用B(x)对E进行膨胀的结果就是把结构元素B平移后使B与E的交集非空的点构成的集合。先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。
       可见,二值形态膨胀与腐蚀可转化为集合的逻辑运算,算法简单,适于并行处理,且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状分析。但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的,对不同的目标图像需设计不同的结构元素和不同的处理算法。结构元素的大小、形状选择合适与否,将直接影响图像的形态运算结果。因此,很多学者结合自己的应用实际,提出了一系列的改进算法。如梁勇提出的用多方位形态学结构元素进行边缘检测算法既具有较好的边缘定位能力,又具有很好的噪声平滑能力。许超提出的以最短线段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法,用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相容性,适于对形状进行分析和描述。

(2)灰度数学形态学
       二值数学形态学可方便地推广到灰度图像空间。只是灰度数学形态学的运算对象不是集合,而是图像函数。以下设f(x,y)是输入图像,b(x,y)是结构元素。用结构元素b对输入图像y进行膨胀和腐蚀运算分别定义为:

对灰度图像的膨胀(或腐蚀)操作有两类效果:
(1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);
(2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。灰度数学形态学中开启和闭合运算的定义与在二值数学形态学中的定义一致。用b对f进行开启和闭合运算的定义为:

(3)模糊数学形态学
       将模糊集合理论用于数学形态学就形成了模糊形态学。模糊算子的定义不同,相应的模糊形态运算的定义也不相同。在此,选用Shinba的定义方法。模糊性由结构元素对原图像的适应程度来确定。用有界支撑的模糊结构元素对模糊图像的腐蚀和膨胀运算按它们的隶属函数定义为:

 

其中,x,yZ2代表空间坐标,uaub分别代表图像和结构元素的隶属函数。从(7),(8)式的结果可知,经模糊形态腐蚀膨胀运算后的隶属函数均落在[0,1]的区间内。模糊形态学是传统数学形态学从二值逻辑向模糊逻辑的推广,与传统数学形态学有相似的计算结果和相似的代数特性。模糊形态学重点研究n维空间目标物体的形状特征和形态变换,主要应用于图像处理领域,如模糊增强、模糊边缘检测、模糊分割等。

 

 数学形态学在图像处理中的主要应用

 

近年来,数学形态学在图像处理方面得到了日益广泛的应用。下面主要就数学形态学在边缘检测、图像分割、图像细化以及噪声滤除等方面的应用做简要介绍。

 

(1)       边缘检测

边缘检测是大多数图像处理必不可少的一步,提供了物体形状的重要信息。对于二值图像,边缘检测是求一个集合A的边界,记为BA):

 

 

对于灰度图像,边缘检测是求一幅图像的形态学梯度,记为g

 

 

数学形态学运算用于边缘检测,存在着结构元素单一的问题。它对与结构元素同方向的边缘敏感,而与其不同方向的边缘(或噪声)会被平滑掉,即边缘的方向可以由结构元素的形状确定。但如果采用对称的结构元素,又会减弱对图像边缘的方向敏感性。所以在边缘检测中,可以考虑用多方位的形态结构元素,运用不同的结构元素的逻辑组合检测出不同方向的边缘。

梁勇等人构造了8个方向的多方位形态学结构元素,应用基本形态运算,得到8个方向的边缘检测结果,再把这些结果进行归一化运算、加权求和,得到最终的图像边缘。该算法在保持图像细节特征和平滑边缘等方面,取得了较好的效果。

 

(2)       图像分割

基于数学形态学的图像分割算法是利用数学形态学变换,把复杂目标X分割成一系列互不相交的简单子集

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的实现过程: 1. 导入opencv库和其他必要的头文件,包括cv.h、highgui.h、imgproc.h等。 ```c #include <stdio.h> #include <stdlib.h> #include <opencv2/highgui/highgui_c.h> #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> ``` 2. 读取图像并转换为灰度图像。 ```c IplImage* img = cvLoadImage("image.jpg", CV_LOAD_IMAGE_COLOR); IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); cvCvtColor(img, gray, CV_BGR2GRAY); ``` 3. 对图像进行预处理,包括高斯模糊、二值化、腐蚀膨胀等操作,以消除噪声和增强图像特征。 ```c cvSmooth(gray, gray, CV_GAUSSIAN, 3, 3); cvThreshold(gray, gray, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); cvErode(gray, gray, NULL, 1); cvDilate(gray, gray, NULL, 1); ``` 4. 提取特征,可以使用HOG(方向梯度直方图)或LBP(局部二值模式)等方法。 ```c CvMat* feature_mat = cvCreateMat(1, feature_size, CV_32FC1); for (int i = 0; i < feature_size; i++) { cvmSet(feature_mat, 0, i, feature_vector[i]); } ``` 5. 将提取的特征输入到分类器中进行识别。可以使用SVM(支持向量机)或神经网络等算法。 ```c CvSVM svm; svm.load("svm.xml"); float result = svm.predict(feature_mat); ``` 6. 根据分类器输出的结果判断是否识别出禁止右转道路交通标识标志。 ```c if (result == 1) { printf("禁止右转道路交通标识标志"); } else { printf("未识别出禁止右转道路交通标识标志"); } ``` 7. 对于鲁棒性的要求,可以在训练分类器时增加正负样本的数量,并使用交叉验证等方法来提高模型的泛化能力。 这只是一个简单的实现过程,具体的实现方法需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值