我有一个分段图像
当我对此应用bwperim函数时,我得到如下输出
我希望有一条细线外围 - 只有一个像素厚。这对于进一步的处理工作至关重要。什么是最好的方法?
请建议。
====== BoundingBox的
%%% ComputeBoundingBox %%% 功能[stats,statsAlreadyComputed] = ... ComputeBoundingBox(IMAGESIZE,统计,statsAlreadyComputed) %[minC minR宽度高度]; minC和minR以.5结束。
if~statsAlreadyComputed.BoundingBox statsAlreadyComputed.BoundingBox = 1;
[stats, statsAlreadyComputed] = ...
ComputePixelList(imageSize,stats,statsAlreadyComputed);
num_dims = numel(imageSize);
for k = 1:length(stats)
list = stats(k).PixelList;
if (isempty(list))
stats(k).BoundingBox = [0.5*ones(1,num_dims) zeros(1,num_dims)];
else
min_corner = min(list,[],1) - 0.5;
max_corner = max(list,[],1) + 0.5;
stats(k).BoundingBox = [min_corner (max_corner - min_corner)];
end
end
端
答案 0 :(得分:3)
发生这种情况是因为保存图像时图像出现量化错误。您是否使用有损压缩算法(如JPEG)保存图像?如果您想保留强度以便在保存图像时不会改变,请使用无损压缩算法,例如PNG。
消除这些"嘈杂"效果,首先阈值您的图像消除任何量化错误,以便您可以将这些像素设置为完全白色,然后再次尝试使用bwperim
。换句话说,做这样的事情:
im = im2bw(imread('http://i.stack.imgur.com/dagEc.png'));
im_noborder = imclearborder(im);
out = bwperim(im_noborder);
imshow(out);
第一行代码直接从StackOverflow读取您的图像,我们使用im2bw
来限制您的图像。此图像最初是灰度图像,因此我们只想将其转换为黑白图像。这也将删除任何量化伪像,因为它阈值高于128.下一行代码删除了围绕您的形状的imclearborder
的白色边框,因为您上传的图像由于某种原因在其周围有白色边框。删除此边框后,我们会应用bwperim
并显示图片。
这是我得到的图像: