美文网首页
Morphology -形态学操作

Morphology -形态学操作

作者: 我的名字好长好长灬 | 来源:发表于2017-04-21 12:21 被阅读195次

前言

简单的来讲,形态学操作是基于形状的图像处理操作,通过将结构元素作用于输入图像来输出图像。

对图像形态学运算,这里有详细的介绍。

这个有什么用呢?

消除噪声

分割(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。

cv::MorphShapes_c参数列表

这里就已自定义的Element来Erode一下图像,Dilate原理想同,就不做解释了。

简图

我们创建一个4*4的Element来Erode这幅图像。

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_ERODE 图像膨胀操作-MORPH_DILATE MORPH_OPEN MORPH_CLOSE MORPH_GRADIENT MORPH_TOPHAT MORPH_BLACKHAT

需要注意的是MORPH_HITMISS type参数是需要输入一个二值图像。

这些操作无非就是一个套一个,好像有很多都是某个的逆运算哈。

相关文章

网友评论

      本文标题:Morphology -形态学操作

      本文链接:https://www.haomeiwen.com/subject/dqsczttx.html