Engee 文档
Notebook

形态操作,第 1 部分

形态学图像处理是计算机视觉的一个领域,主要处理二进制和灰度图像中的瑕疵。

ImageMorphology 包含一系列与图像元素的形状或形态有关的非线性操作。

在本演示中,我们将了解 8 种最常见的形态学操作。

In [ ]:
Pkg.add(["TestImages", "ImageMorphology"])
In [ ]:
using Images
using ImageMorphology, TestImages

img = Gray.(testimage("morphology_test_512"))
Out[0]:
No description has been provided for this image

侵蚀

侵蚀功能对近邻进行最小化过滤。默认情况下,2D 为 8 个链接,3D 为 27 个链接,等等。您可以指定一个您希望包含在连接中的维度列表,例如,region = [1,2]可以将第三个维度排除在过滤之外。

下面是一个示例,说明如何使用 3x3 结构元素对二进制图像进行侵蚀。

image.png

In [ ]:
img_erode = @. Gray(img < 0.8); # keeps white objects white
img_erosion1 = erode(img_erode)
img_erosion2 = erode(erode(img_erode))
mosaicview(img_erode, img_erosion1, img_erosion2; nrow = 1)
Out[0]:
No description has been provided for this image

扩建

扩张函数对其最近邻域执行最大化过滤。默认情况下,它的工作方式与 erode 相同。

image.png

In [ ]:
img_dilate = @. Gray(img > 0.9);
img_dilate1 = dilate(img_dilate)
img_dilate2 = dilate(dilate(img_dilate))
mosaicview(img_dilate, img_dilate1, img_dilate2; nrow = 1)
Out[0]:
No description has been provided for this image

发现

形态学操作 opening 相当于 dilate(erode(img))。在 opening(img,[区域])中,区域允许您控制执行此操作的尺寸。 打开可以去除小亮点并连接小的暗裂缝。

In [ ]:
img_opening = @. Gray(1 * img > 0.5);
img_opening1 = opening(img_opening)
img_opening2 = opening(opening(img_opening))
mosaicview(img_opening, img_opening1, img_opening2; nrow = 1)
Out[0]:
No description has been provided for this image

关闭

关闭形态学操作等同于 erode(dilate(img))。函数 closing(img,[区域])的工作原理与 closing(img,[区域])类似。闭合可以去除小的暗点并连接小的浅色裂缝。

In [ ]:
img_closing = @. Gray(1 * img > 0.5);
img_closing1 = closing(img_closing)
img_closing2 = closing(closing(img_closing))
mosaicview(img_closing1, img_closing1, img_closing2; nrow = 1)
Out[0]:
No description has been provided for this image

顶帽

tophat 函数的定义是图像减去其形态学开口。 tophat(img, [region]) 的工作原理与开口和闭合类似。此操作会返回图像中小于结构元素的亮点。

In [ ]:
img_tophat = @. Gray(1 * img > 0.2);
img_tophat1 = tophat(img_tophat)
img_tophat2 = tophat(tophat(img_tophat))
mosaicview(img_tophat, img_tophat1, img_tophat2; nrow = 1)
Out[0]:
No description has been provided for this image

底帽

底帽形态学操作被定义为图像的形态闭合减去原始图像。Bothat(img,[region])的定义与 Bottom-Hat 类似。此操作会返回图像中小于结构元素的暗点。

In [ ]:
img_bothat = @. Gray(1 * img > 0.5);
img_bothat1 = bothat(img_tophat)
img_bothat2 = bothat(bothat(img_tophat))
img_bothat3 = bothat(bothat(bothat(img_tophat)))
mosaicview(img_bothat, img_bothat1, img_bothat2; nrow = 1)
Out[0]:
No description has been provided for this image

形态梯度

形态学梯度是图像扩张和侵蚀之间的差值。morphogradient(img, [region]) 的定义与 tophat 相同。

In [ ]:
img_gray = @. Gray(0.8 * img > 0.7);
img_morphograd = morphogradient(@. Gray(0.8 * img > 0.4))
mosaicview(img_gray, img_morphograd; nrow = 1)
Out[0]:
No description has been provided for this image

拉普拉斯形态学算子

形态拉普拉斯运算符返回的值定义为内梯度和外梯度的算术差值。函数 morpholaplace(img, [region]) 的定义与 tophat 类似。

In [ ]:
img_gray = @. Gray(0.8 * Gray.(img) > 0.7);
img_morpholap = morpholaplace(img_gray)
mosaicview(img_gray, img_morpholap; nrow = 1)
Out[0]:
No description has been provided for this image

输出

在本例中,我们对可用于图像的形态学操作进行了细分。