试图在 MATLAB 中保持形状时的形态 thickening/dilation

Morphological thickening/dilation while trying to preserve shape in MATLAB

我正在加厚二值图像。我希望将标签向每个方向增长 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] 并得到以下图像:

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

我知道扩张总是会在一定程度上扭曲边界。我试验了结构元素'disk'(r=5,扩大了5倍),得到了相当不错的结果:

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

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

试试这个:

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

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

更新:正如@Tapio 所说,可以使用 imresize:

轻松调整调整大小因子
 figure; imshow(imdilate(bw, strel('arbitrary', imresize(bw, 0.5))))

具有以下输出:

如果你只使用单一结构元素,那么你将永远面临你所描述的问题。如果你想用大小为 N 的结构元素膨胀一个形状,不要使用 N 次大小为 1 的结构元素,否则你最终会得到美丽的意想不到的变形。

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

另一个解决方案是使用距离图:形状是种子(距离为0),那么距离小于N的所有东西都是你的结果。这将与大小 N 的膨胀非常相似。