【问题标题】:Morphological thickening/dilation while trying to preserve shape in MATLAB尝试在 MATLAB 中保持形状时的形态增厚/膨胀
【发布时间】:2016-12-22 16:25:23
【问题描述】:

我正在加厚二值图像。我希望将标签 n 像素扩展到每个方向。

原图:

一开始我使用函数 bwmorph(I, 'thicken', 25) 得到了这个图像:

这不好。加厚似乎使用了结构元素 [0,1,0;1,1,1;0,1,0],因此它总是将圆形转换为菱形。使用上述结构元素进行 imdilate 会产生相同的输出。

接下来,我尝试使用结构元素 [1,1,1; 迭代扩展原始图像 n=25 次; 1,1,1; 1,1,1]并得到以下图像:

原来的形状现在完全消失了。

我知道扩张总是会在某种程度上扭曲边界。我尝试了结构元素“磁盘”(r=5,膨胀 5 次)并得到了相当不错的结果:

这是最好的吗?如果我希望尽可能地保留原始圆形,我应该选择哪个结构元素?是否有任何好的经验法则可以为特定的膨胀距离找到合适的尺寸(可以从 10 到 100 不等,标签从圆形到椭圆形不等)?有没有更好的方法在保持原始形状的同时在所有方向上增长二值图像?

有没有办法保持欧拉特性——保持增厚的质量,同时将结构元素更改为更合适的东西?

【问题讨论】:

  • 拟合并平滑轮廓。

标签: matlab image-processing image-morphology


【解决方案1】:

试试这个:

bw = imread('bw.png');
figure; imshow(imdilate(bw, strel('arbitrary', bw)))

我正在使用图像本身来扩展它。它提供了更保形的增长:

更新:正如@Tapio 所说,可以使用imresize 轻松调整调整大小:

 figure; imshow(imdilate(bw, strel('arbitrary', imresize(bw, 0.5))))

输出如下:

【讨论】:

  • 这非常有效。 imdilate(bw, strel('arbitrary', imresize(bw, 0.1))) 保持边界完整,并让您调整增长大小。
  • 你说得对,使用imresize更方便。我会更新我的帖子。
【解决方案2】:

如果您只使用单一结构元素,那么您将始终面临您所描述的问题。如果你想用大小为 N 的结构元素来扩张一个形状,不要使用大小为 1 的结构元素的 N 倍,否则你会得到意想不到的美丽变形。

如果要进行大小为 N 的膨胀,请尝试半径为 N 的磁盘。但是,处理时间会长得多。

另一种解决方案是使用距离图:形状是种子(距离 0),然后距离小于 N 的所有内容都是您的结果。这将非常类似于大小 N 的膨胀。

【讨论】:

  • 距离图似乎非常有用!然而,在这种情况下,原始图像约为 2000x1000,并且大部分为 0,因为它可以方便地用原始 rgb 图像覆盖标签,而无需单独跟踪坐标。因此,至少在我所做的测试中,进行距离变换实际上比大 strel 膨胀慢一个数量级。
  • 距离图只是计算转换的一种手段,它本身并不是结果。一旦计算了距离图,就可以找到标签。在 2000x1000 的图像上计算距离图应该非常快。
  • 当然,我明白了。我刚刚注意到,在我的机器上运行一些测试时,初始距离变换通常比仅使用 N 大小的磁盘进行扩张慢一个数量级。两者都很快以至于没关系,只是注意到在这种情况下用大磁盘扩张是可行的。
  • 好的,明白了! :-)
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多