笔记:形态学操作-----腐蚀Erode && 膨胀 Dilate

通俗的说:

膨胀算法使图像扩大一圈。
腐蚀算法使二值图像减小一圈。


腐蚀:删除对象边界的某些像素
膨胀:给图像中的对象边界添加像素


算法:


   从图像处理角度看,二值图像的腐蚀和膨胀就是将一个小型二值图(结构元素,一般为3*3大小)在一个大的二值图上逐点移动并进行比较,根据比较的结果作出相应处理而已。

膨胀算法:用3X3的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为0,结构图像的该像素为0,否则为1.结果:使二值图像扩大一圈。


腐蚀算法:用3X3的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为1,结构图像的该像素为1,否则为0.结果:使二值图像减小一圈。


注意:

opencv里面的腐蚀膨胀都是针对 白色 目标区域的。

说,膨胀使图像 变大一圈, 那是指  图像中的 白色目标区域  扩大了一圈~~~大笑~~~腐蚀,亦然。

====================================

代码:

#include "stdafx.h"
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include "cvaux.h" //必须引此头文件
int main( int argc, char** argv )
{ 

	IplImage *img = cvLoadImage("rice.png",0);
	if(img == NULL)
	{
		printf("img load failed!\n");
		return 0;
	}
	IplImage *img_erode = cvCreateImage(cvGetSize(img), 8, 1);
	IplImage *img_dilate = cvCreateImage(cvGetSize(img), 8, 1);

	cvErode( img,img_erode, NULL,1); //腐蚀
	cvDilate( img,img_dilate, NULL,1); //膨胀

	cvNamedWindow("img_erode");
	cvNamedWindow("img_dilate");

	cvShowImage("img_erode",img_erode);
	cvShowImage("img_dilate",img_dilate);

	cvWaitKey(-1);


	cvReleaseImage(&img_dilate);
	cvReleaseImage(&img_erode);

	cvDestroyAllWindows();


	return 0;
}

图示:

笔记:形态学操作-----腐蚀Erode && 膨胀 Dilate_第1张图片


附:

Dilate    使用任意结构元素膨胀图像


void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
src
输入图像.
dst
输出图像.
element
用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations
膨胀的次数


对彩色图像,每个彩色通道单独处理。


Erode    使用任意结构元素腐蚀图像


void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
src
输入图像.
dst
输出图像.
element
用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations
腐蚀的次数


函数 cvErode 对输入图像使用指定的结构元素进行腐蚀,该结构元素决定每个具有最小值象素点的邻域形状:


你可能感兴趣的:(笔记:形态学操作-----腐蚀Erode && 膨胀 Dilate)