Opencv处理图像--腐蚀、膨胀

Opencv处理图像--腐蚀、膨胀

学习之前先弄明白什么是结构元素:

结构元素:二维结构元素可以理解成一个二维矩阵,矩阵元素的值为0或者1;通常结构元素要小于待处理的图像。

腐蚀与膨胀基本原理:就是用一个特定的结构元素来与待处理图像按像素做逻辑操作;可以理解成拿一个带孔的网格板(结构元素矩阵中元素为1的为孔)盖住图像的某一部分,然后按照各种不同的观察方式来确定操作类型。

比如:腐蚀操作就是拿这个结构元素的中心位置(假设参与逻辑计算的元素对应与二维矩阵中元素为1的点,即网格板上的孔),在图像上移动时,如果透过所有的孔都能看到底下的图像,那么这个中心点处的图像就保留,否则去除。

代码如下:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
int main()
{
	IplImage* src = cvCreateImage(cvSize(5,5),8,1);
	IplImage* dst = cvCreateImage(cvGetSize(src),8,1); //用来存储腐蚀后的
	IplImage* dst1 = cvCreateImage(cvGetSize(src),8,1); //用来存在膨胀后的
	int x,y;
	for(y = 2;y<4;y++){
		for(x = 2;x<4;x++){
			cvSetReal2D(src,y,x,0);
		}
	}
	for(y = 0;y<src->height;y++){
		for(x = 0;x<src->width;x++){
			double value = cvGetReal2D(src,y,x);
			printf("%3d ",(int)value);
		}
		printf("\n");
	}

	IplConvKernel* element = 0;
	int values[16] = {0,0,0,0,  //自己设置的结构元素
					  0,0,1,0,
					  0,1,1,0,
					  0,0,0,0};

	int cols = 4,rows = 4,anchor_x = 2,anchor_y = 2;

	element = cvCreateStructuringElementEx(cols,rows,anchor_x,anchor_y,CV_SHAPE_CUSTOM,values); //创建结构

	cvErode(src,dst,element,1); //腐蚀  取最小值
	

	printf("dst--\n");
	for(y = 0;y<dst->height;y++){
		for(x = 0;x<dst->width;x++){
			double value = cvGetReal2D(dst,y,x);
			printf("%3d ",(int)value);
		}
		printf("\n");
	}

	cvDilate(dst,dst1,element,1);//膨胀  取最大值
	printf("dst1--\n");
	for(y = 0;y<dst1->height;y++){
		for(x = 0;x<dst1->width;x++){
			double value = cvGetReal2D(dst1,y,x);
			printf("%3d ",(int)value);
		}
		printf("\n");
	}
	//cvWaitKey(0);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sm16111/article/details/81479212