形态运算符

在 0.8 版本加入: 在0.8版中添加了Open()和Close()

形态运算符是Mahotas中的第一个操作(当时,它甚至只是一个简单的C++模块 morph )。从那时起,Mahotas已经成长了很多。这个模块也已经发展壮大,获得了更多的形态运算符,并在速度上进行了优化。

让我们首先选择一幅有趣的图片

import mahotas
import mahotas.demos
from pylab import gray, imshow, show
import numpy as np

luispedro = mahotas.demos.load('luispedro')
luispedro = luispedro.max(2)
T = mahotas.otsu(luispedro)
lpbin = (luispedro > T)
gray()
eye = ~lpbin[112:180,100:190]
imshow(eye)
show()

(Source code, png, hires.png, pdf)

_images/morphology-1.png

2013年10月后,你可以看到这张带有mahotas的图片::

import mahotas.demos
luispedro = mahotas.demos.load('luispedro')
luispedro = luispedro.max(2)

膨胀与侵蚀

Dilationerosion 是两个非常基本的运算符(从数学上讲,你只需要其中一个,因为你可以将侵蚀定义为负数的膨胀,反之亦然)。

这些操作可在 mahotas.morph 模块:

mahotas.morph.dilate(eye)

从直觉上讲,扩张会让正面区域变得“更胖”:

imshow(mahotas.morph.dilate(eye))
show()

(Source code, png, hires.png, pdf)

_images/morphology-2.png
mahotas.morph.erode(eye)

相比之下,侵蚀会使它们变得稀薄:

imshow(mahotas.morph.erode(eye))
show()

(Source code, png, hires.png, pdf)

_images/morphology-3.png

Mahotas支持灰度侵蚀和膨胀(取决于 dtype 参数),并且您可以指定任何您想要的结构化元素(包括非平面元素)。默认情况下,使用1-十字::

# if no structure-element is passed, use a cross:
se = np.array([
        [0, 1, 0],
        [1, 1, 1],
        [0, 1, 0]], bool)

但是,您可以使用您想要的任何结构化元素::

se = np.array([
    [1, 1, 0],
    [1, 1, 1],
    [0, 1, 1]], bool)
dilated = mahotas.morph.dilate(eye, se)
eroded = mahotas.morph.erode(eye, se)

请注意,当您将非布尔数组作为第一个参数传递给它时,您将获得 grescale erosion 。Mahotas支持全灰度侵蚀,包括任意、平坦或非平坦的结构元素)。

关闭和打开

关闭和打开是基于侵蚀和膨胀。同样,它们在灰度级中工作,可以使用任意的结构元素。

以下是结束语:

mahotas.morph.close(eye)
imshow(mahotas.morph.close(eye))
show()

(Source code, png, hires.png, pdf)

_images/morphology-4.png

下面是开场白:

mahotas.morph.open(eye)
imshow(mahotas.morph.open(eye))
show()

(Source code, png, hires.png, pdf)

_images/morphology-5.png

两者都有 closeopen 将可选的结构元素作为第二个参数::

mahotas.morph.open(eye, se)