数学形态运算,最常见的基本运算有七种,分别为:腐蚀、膨胀、开运算、闭运算、击中、细化和粗化,它们是全部形态学的基础。
如下代码即可实现腐蚀与膨化。
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src = cvLoadImage("jk.jpg");
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
cvErode(src,dst,NULL,2);
cvSaveImage("erode.jpg",dst);
//cvDilate(src,dst,NULL,2);
//cvSaveImage("dilate.jpg",dst);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
return 0;
}
/*****************************
腐蚀和膨胀,看上去好像是一对互逆的操作,实际上,这两种操作不具有互逆的关系。
开运算和闭运算正是依据腐蚀和膨胀的不可逆性,演变而来的。
先腐蚀后膨胀的过程就称为开运算。
闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的,闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界,同时不明显改变不明显改变其面积。
******************************/
作用:
cvErode()腐蚀后cvDilate()膨胀,叫作开操作,那些离散点或游丝线、毛刺就被过滤,
cvDilate()膨胀后cvErode()腐蚀,叫作闭操作,那些断裂处就被缝合。
cvErode,是opencv库中的一个函数。函数形式为:void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );研究方法:src:输入图像。dst:输出图像。element:用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素,iterations:腐蚀的次数。
element可以用cvCreateStructuringElementEx创建,用cvReleaseStructuringElement释放。如下:
IplConvKernel* cvCreateStructingElementEx(
int cols, //行
int rows, //列
int anchor_x, //核的封闭矩形内的参考点的坐标
int anchor_y,
int shape, //CV_SHAPE_RECT:核是矩形,CV_SHAPE_CROSS:十字交叉形,CV_SHAPE_ELLIPSE:椭圆形,CV_SHAPE_CUSTOM:用户自定义的值
int* values = null
);
高级操作
对于灰度图或彩色图,不可以直接用cvErode和cvDilate来处理,这里需要更通用的函数,即cvMorphologyEx,例子如下:
#include "StdAfx.h"
#include "cv.h"
#include "highgui.h"
#include "highgui.h"
int main(int argc, char ** argv)
{
cvNamedWindow("sourceImage");
cvNamedWindow("open");
cvNamedWindow("close");
cvNamedWindow("gradient");
cvNamedWindow("topHat");
cvNamedWindow("blackHat");
IplImage * src = cvLoadImage("test.bmp");
cvShowImage("sourceImage",src);
IplImage * temp = cvCreateImage(cvGetSize(src), 8,3);
IplImage * img=cvCreateImage(cvGetSize(src), 8, 3);
cvCopyImage(src,temp);
cvCopyImage(src, img);
//开运算
cvMorphologyEx(
src,
img,
temp,
NULL, //default 3*3
CV_MOP_OPEN,
4);
cvShowImage("open", img);
//闭运算
cvMorphologyEx(
src,
img,
temp,
NULL, //default 3*3
CV_MOP_CLOSE,
4);
cvShowImage("close", img);
//形态梯度
cvMorphologyEx(
src,
img,
temp,
NULL, //default 3*3
CV_MOP_GRADIENT,
3);
cvShowImage("gradient", img);
//cvWaitKey(0);
//"礼帽"
cvMorphologyEx(
src,
img,
temp,
NULL, //default 3*3
CV_MOP_TOPHAT,
3);
cvShowImage("topHat", img);
//cvWaitKey(0);
//“黑帽”
cvMorphologyEx(
src,
img,
temp,
NULL, //default 3*3
CV_MOP_BLACKHAT,
3);
cvShowImage("blackHat", img);
cvWaitKey(0);
cvReleaseImage(&temp);
cvReleaseImage(&src);
cvReleaseImage(&img);
cvDestroyAllWindows();
return 0;
}