首页 > 解决方案 > 如何使用 MATLAB 的 imextendedmin 和 skimage.morphology.extrema.h_minima

问题描述

我想提取面具的局部最小值(标记)(我不想使用侵蚀)。
我首先计算了掩码逆的距离变换并将其取反。

D = -cv2.distanceTransform(~mask, distanceType=cv2.DIST_L2, maskSize=5)

在我回答我的问题之前,我想比较 MATLABimextendedminskimage.morphology.extrema.h_minima

给定的图像是:
在此处输入图像描述

MATLAB的结果imextendedmin(mask, 2)是:
在此处输入图像描述

使用的结果skimage.skimage.morphology.extrema.h_minima(mask, 2)
在此处输入图像描述

我对 ' 的结果不满意,skimage.morphology.extrema.h_minima因为一些连接的区域被分成两个(放大查看)并且局部最小值区域太小。

两种变换都确定深度 >= h 的距离变换的所有最小值。但是为什么这两种转换会给出不同的结果呢?


我的另一个问题是 h_minima 究竟是如何工作的。例如,坐标处的像素(158, 0)(下一张图片)在 之后被视为局部最小值skimage.morphology.extrema.h_minima(D, 2),但是,当我查看该点(最后一张图片)的距离变换时,它与邻居之间的距离并不是少了 2 个点。为什么它被视为局部最小值?
h_minima transform 距离变换两种变换都按预期对以下矩阵给出了相同的结果。在此处输入图像描述
在此处输入图像描述

f = [[190, 188, 186, 185, 185, 185, 185, 185, 186, 188],
       [188, 186, 185, 184, 183, 183, 183, 184, 185, 186],
       [186, 185, 160, 160, 182, 181, 182, 140, 140, 185],
       [185, 184, 160, 160, 181, 180, 181, 140, 140, 184],
       [185, 183, 182, 181, 180, 180, 180, 181, 182, 183],
       [185, 183, 181, 180, 180, 180, 180, 180, 181, 183],
       [185, 183, 182, 181, 180, 180, 180, 181, 182, 183],
       [185, 184, 120, 120, 181, 180, 181, 100, 100, 184],
       [186, 185, 120, 120, 182, 181, 182, 100, 100, 185],
       [188, 186, 185, 184, 183, 183, 183, 184, 185, 186]]

skimage.morphology.extrema.h_minima(D, 30)和之后的结果imextendedmin(mask, 30)是:

      [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 0, 0, 0, 1, 1, 0],
       [0, 0, 1, 1, 0, 0, 0, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

小于 30 的深度将被抑制。

标签: matlabcv2scikit-image

解决方案


推荐阅读