首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何平滑bwperim的周边输出?

如何平滑bwperim的周边输出?
EN

Stack Overflow用户
提问于 2015-01-02 05:30:39
回答 1查看 892关注 0票数 1

我有一个分割的图像

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

我想要一条薄薄的周长--只有一个像素厚。这对于进一步的加工工作是必不可少的。什么是最好的方法?

请建议一下。

====== BoundingBox

%% ComputeBoundingBox %%函数统计量,statsAlreadyComputed =.ComputeBoundingBox(imageSize,stats,statsAlreadyComputed) % minC minR宽度高度;minC和minR以.5结尾。

若~statsAlreadyComputed.BoundingBox statsAlreadyComputed.BoundingBox = 1;

代码语言:javascript
复制
[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

结束

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 06:27:06

这是因为您的图像在保存图像时有量化错误。您是否使用有损压缩算法保存图像,如JPEG?如果您希望保留强度,使其在保存图像时不会发生变化,请使用无损压缩算法,如PNG。

为了消除这些“噪声”效应,首先对图像进行阈值化以消除任何量化误差,这样就可以将这些像素设置为完全白色,然后再尝试使用bwperim。换句话说,做这样的事情:

代码语言:javascript
复制
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并显示图像。

这就是我得到的图像:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27737760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档