如何平滑bwperim的周边输出?

时间:2015-01-02 05:30:40

标签: matlab image-processing

我有一个分段图像  segmented result of original RGB image

当我对此应用bwperim函数时,我得到如下输出

perimeter got after applying 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

1 个答案:

答案 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并显示图片。

这是我得到的图像:

enter image description here