空巴瓦
【11】Morphology_1.cpp Morphology_2.cpp
形态学操作
就是
基于形状的一系列图像处理操作。
通过将 结构元素 作用于输入图像来产生输出图像。
最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。
他们的运用广泛:
消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域。
沒錯啦,我本人長這樣。
膨胀
此操作将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积。
内核 B 有一个可定义的 锚点, 通常定义为内核中心点。
进行膨胀操作时,将内核B 划过图像,将内核B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:
背景(白色)膨胀,而黑色字母缩小了。
腐蚀
它提取的是内核覆盖下的相素最小值。
进行腐蚀操作时,将内核B 划过图像,将内核B 覆盖区域的最小相素值提取,并代替锚点位置的相素。
以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。
本程序的总体流程:
装载图像 (可以是 RGB图像或者灰度图 )
创建两个显示窗口 (一个用于膨胀输出,一个用于腐蚀输出)
为每个操作创建两个 Trackbars:
第一个 trackbar “Element” 返回 erosion_elem 或者 dilation_elem
第二个 trackbar “Kernel size” 返回 erosion_size 或者 dilation_size 。
每次移动标尺, 用户函数 Erosion 或者 Dilation 就会被调用,函数将根据当前的trackbar位置更新输出图像。
老虎沒被虐之前。
剛吃了一道小當家做的料理,全身忍不住發光啊。
膨胀
void dilate(
const Mat& src, Mat& dst,
const Mat& element,
Point anchor=Point(-1, -1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue())
进行 腐蚀 操作的函数是 erode 。
void erode(
const Mat& src, Mat& dst,
const Mat& element,
Point anchor=Point(-1, -1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
)
参数:
element: 腐蚀操作的内核。如果不指定,默认为一个简单的 矩阵。
否则,我们就要明确指定它的形状,
可以使用函数 getStructuringElement:
Mat element = getStructuringElement( erosion_type,
Size( 2*erosion_size + 1, 2*erosion_size+1 ),
Point( erosion_size, erosion_size ) );
我们可以为我们的内核选择三种形状之一:
矩形: MORPH_RECT
交叉形: MORPH_CROSS
椭圆形: MORPH_ELLIPSE
anchor 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。
下面的著名家常菜:亂燉
0: Opening
开运算是通过先对图像腐蚀再膨胀实现的。
1: Closing
闭运算是通过先对图像膨胀再腐蚀实现的。
能够排除小型黑洞(黑色区域)。
2: Gradient
形态梯度(Morphological Gradient)
膨胀图与腐蚀图之差
能够保留物体的边缘轮廓
3: Top Hat
原图像与开运算结果图之差
4: Black Hat
闭运算结果图与原图像之差
运行形态学操作的核心函数是 morphologyEx 。
void morphologyEx(
const Mat& src, Mat& dst,
int op,
const Mat& element,
Point anchor=Point(-1, -1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue())
在本例中,我们使用了4个参数(其余使用默认值):
src : 原 (输入) 图像
dst: 输出图像
operation: 需要运行的形态学操作。
我们有5个选项:
Opening: MORPH_OPEN : 2
Closing: MORPH_CLOSE: 3
Gradient: MORPH_GRADIENT: 4
Top Hat: MORPH_TOPHAT: 5
Black Hat: MORPH_BLACKHAT: 6