Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中尝试保持形状时的形态学增厚/扩张_Matlab_Image Processing_Image Morphology - Fatal编程技术网

在MATLAB中尝试保持形状时的形态学增厚/扩张

在MATLAB中尝试保持形状时的形态学增厚/扩张,matlab,image-processing,image-morphology,Matlab,Image Processing,Image Morphology,我正在加厚一个二值图像。我希望将标签向每个方向增加n个像素 原始图像: 首先,我使用了函数bwmorphI,'thicken',25,得到了以下图像: 这是不好的。加厚似乎使用结构元素[0,1,0;1,1,1;0,1,0],因此它总是将圆转换为钻石。使用上述结构元素的IMDISPLATE将产生相同的输出 接下来,我尝试用结构元素[1,1,1;1,1,1;1,1,1,1]将原始图像反复放大n=25次,得到以下图像: 原来的形状现在完全消失了 我知道扩张总是会在某种程度上扭曲边界。我用结构元素“di

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

原始图像:

首先,我使用了函数bwmorphI,'thicken',25,得到了以下图像:

这是不好的。加厚似乎使用结构元素[0,1,0;1,1,1;0,1,0],因此它总是将圆转换为钻石。使用上述结构元素的IMDISPLATE将产生相同的输出

接下来,我尝试用结构元素[1,1,1;1,1,1;1,1,1,1]将原始图像反复放大n=25次,得到以下图像:

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

我知道扩张总是会在某种程度上扭曲边界。我用结构元素“disk”r=5进行了实验,放大了5倍,得到了相当好的结果:

这是最好的吗?如果我希望尽可能保留原始圆形,我应该选择哪种结构元素?有没有什么好的经验法则来为一个特定的扩张距离找到合适的尺寸,这个距离可以从10到100不等,标签可以从圆形到椭圆形?在保持原始形状的同时,有没有更好的方法在各个方向上生长二值图像

有没有一种方法可以保持Euler特性—在将结构元素更改为更合适的元素时保持加厚的质量?

尝试以下方法:

bw = imread('bw.png');
figure; imshow(imdilate(bw, strel('arbitrary', bw)))
我使用图像本身来扩展它。它提供了更具形状保护性的生长:

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

具有以下输出:


如果您只使用单一结构元素,那么您将始终面临您描述的问题。如果要使用大小为N的结构元素扩展形状,请不要使用大小为1的结构元素的N倍,否则最终将导致意外的变形

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


另一种解决方案是使用距离贴图:形状是种子距离0,那么距离小于N的所有内容都是结果。这将非常类似于尺寸N的膨胀。

拟合并平滑轮廓。距离图似乎非常有用!然而,在这种情况下,原始图像约为2000x1000,大部分为0,因为可以方便地将标签与原始rgb图像重叠,而无需单独跟踪Cordinate。因此,距离变换实际上比大的strel膨胀慢一个数量级,至少在我做的测试中是这样。距离映射只是计算变换的一个平均值,它本身不是一个结果。一旦计算了距离贴图,就可以找到标签。在图像2000x1000上计算距离地图应该很快。当然,我明白了。我只是注意到,在我的机器上运行一些测试时,在我的例子中,初始距离变换通常比仅使用N大小的磁盘进行扩展慢一个数量级。这两种方法都很快,没关系,只是注意到在这种情况下,用大圆盘扩张是可行的。好的,明白了!:-这非常有效。IMBW,strel'arbitral',imresizebw,0.1保持边框完整,并允许您调整增长大小。您是对的,使用imresize更方便。我会更新我的帖子。
 figure; imshow(imdilate(bw, strel('arbitrary', imresize(bw, 0.5))))