前言
简单的来讲,形态学操作是基于形状的图像处理操作,通过将结构元素作用于输入图像来输出图像。
对图像形态学运算,这里有详细的介绍。
这个有什么用呢?
消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域。 出自《OpenCV》
形态学操作介绍
我先来分析一下接下来要做什么事情:
1.我们需要创建一张图像,将多通道图像spilt成单通道图像。<传多通道图像也可以>
2.对图形进行形态学操作。
3.将多个单通道图像Merge成多通道图像,输出图像。
其实就我的理解,腐蚀就是求某个范围的最小值,膨胀则恰恰相反。
OpenCV提供两个方法:
Erode
CVAPI(void) cvErode( const CvArr* src, CvArr* dst,
IplConvKernel* element CV_DEFAULT(NULL),int iterations CV_DEFAULT(1));
Dilate
CVAPI(void) cvDilate( const CvArr* src, CvArr* dst,
IplConvKernel* element CV_DEFAULT(NULL),int iterations CV_DEFAULT(1));
当然黑体标注的参数是必须要传的参数,一个是输入图像,一个是输出图像。之间已经说过标注CV_DEFAULT的是默认参数,传可以,不传就加载默认值(If element pointer is NULL, 3x3 rectangular element is used,iterations default 1-😊这个是我说的,黑体是文档说的)。
所以说我们先得研究一下这个lpIConvKernel。
typedef struct _IplConvKernel {int nCols;int nRows;int anchorX;int anchorY;int *values;int nShiftR;}IplConvKernel;
结构体,找一下初始化方法。
CVAPI(IplConvKernel*) cvCreateStructuringElementEx(int cols, int rows, int anchor_x, int anchor_y,int shape, int* values CV_DEFAULT(NULL) );
参数:列数 、行数、锚点
@param shape element shape that could be one of the cv::MorphShapes_c
@param values integer array of cols*rows elements that specifies the custom shape of the
structuring element, when shape=CV_SHAPE_CUSTOM.
这里说的也很明白,加载系统默认的Element你有三个参数可以选择,如果自定义Element,shape 参数use CV_SHAPE_CUSTOM。
这里就已自定义的Element来Erode一下图像,Dilate原理想同,就不做解释了。
我们创建一个4*4的Element来Erode这幅图像。
将满足条件的点留下,不满足条件的点丢弃。(当前锚点所处的点是不是最小值,是则留下,不是则抛弃)
道理是这样,我们需要对实际图像做处理,那为了测试结果的准确性,所以做以下测试:
小结
我们可以从膨胀与腐蚀的图像中看出来:
膨胀操作时,将Element划过图像,将Element覆盖区域的最大相素值提取,并代替锚点位置的相素。
腐蚀操作时,将Element划过图像,将Element覆盖区域的最小相素值提取,并代替锚点位置的相素。
需要注意的是:很多文档前景文字颜色为黑色,所以这个文字粗细不能够准确的表达膨胀与腐蚀。
更多形态学算法操作
OpenCV提供了一个可以替换Dilate、Erode的函数,或者可以这样说,OpenCV提供一个能够做形态学变换的函数,其中包含基本的Dilate、Erode操作。
@param op Type of a morphological operation, see cv::MorphTypes
cvMorphologyEx(const CvArr *src, CvArr *dst, CvArr *temp, IplConvKernel *element, int operation,int iterations CV_DEFAULT(1))
这里需要注意的是第三个参数,temp,需要传一个临时参数,operation是MorphTypes的枚举。
需要注意的是MORPH_HITMISS type参数是需要输入一个二值图像。
这些操作无非就是一个套一个,好像有很多都是某个的逆运算哈。