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;
}