matlab - 如何使用 MATLAB 的 imextendedmin 和 skimage.morphology.extrema.h_minima
问题描述
我想提取面具的局部最小值(标记)(我不想使用侵蚀)。
我首先计算了掩码逆的距离变换并将其取反。
D = -cv2.distanceTransform(~mask, distanceType=cv2.DIST_L2, maskSize=5)
在我回答我的问题之前,我想比较 MATLABimextendedmin
和skimage.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 的深度将被抑制。
解决方案
推荐阅读
- html - Facebook 分享按钮与“赞”按钮共享相同的链接?
- php - 表单成功后重定向到不同的 URL
- php - 表单数据未写入 CSV
- dynamic-programming - 零序列
- linux - 如何使用 xargs 从我的 html 文件创建软链接?
- c++ - 指向类对象的 C++ 指针
- javascript - 如何使用 javascript 获取 @keyframes 当前变换值?
- google-apps-script - 将新的(最新的).csv 文件自动导入现有的 Google 电子表格
- php - Symfony 的唯一实体根本不起作用
- angular - Angular 7 Reactive Formarray cascading dropdown - 如何在 UI 表单中加载保存的数据