3

介绍

背景:我正在使用watershedMATLAB 中的算法分割图像。对于内存和时间限制,我更喜欢对二次采样图像执行此分割,假设调整大小为0.45.

问题:出于可视化目的和其他后期处理步骤,我无法正确地将分割的输出重新缩放到原始图像比例。


最小的工作示例

例如,我有这个图像:

在此处输入图像描述

我运行这个最小的脚本,我得到一个L包含在标签图像中的分水岭分割输出,其中每个连接的组件都用一个自然数寻址,并且连接的组件之间的边界为零值:

im_orig = imread('kitty.jpg'); % Load image [530x530]
im_res = imresize(im_orig, 0.45); % Resize image [239x239]
im_res = rgb2gray(im_res); % Convert to grayscale

im_blur = imgaussfilt(im_res, 5); % Gaussian filtering

L = watershed(im_blur); % Watershed aglorithm

现在我有L它具有相同的尺寸im_res如何使用存储的结果L 来实际分割原始 im_orig 图像


错误的解决方案

我尝试的第一种方法是L使用imresize.

L_big = imresize(L, [size(im_orig,1), size(im_orig,2)]); % Upsample L

不幸的是,上采样L会产生一系列不需要的伪像。它尤其丢失了一些表示图像片段之间边界的基本零点。这就是我的意思:

figure; imagesc(imfuse(im_res, L == 0)); axis auto equal;
figure; imagesc(imfuse(im_orig, L_big == 0)); axis auto equal;

在此处输入图像描述 在此处输入图像描述

我知道这是由于升级过程造成的模糊,但现在我想不出任何其他可以成功的方法。

我想到的唯一其他方法涉及使用数学形态学来“放大”调整后图像的边界,然后进行上采样,但这仍然会导致一些不需要的伪影。


TL;DR(或回顾)

有没有办法watershed在 MATLAB 中对缩小的图像执行,然后将结果放大到原始图像,保持算法输出的清晰区域边界?我在寻找一个完全荒谬的问题吗?

4

3 回答 3

2

如果在放大图像后只需要分水岭段边界,那么只需进行以下小改动:

L_big = ~imresize(L==0, [size(im_orig,1), size(im_orig,2)]); % Upsample L

结果如下:

在此处输入图像描述 在此处输入图像描述

于 2017-03-19T18:21:58.843 回答
1

调整大小时可以使用最近邻插值:

L_big = imresize(L, [size(im_orig,1), size(im_orig,2)],'nearest'); % Upsample L
于 2017-03-19T17:54:07.487 回答
0

通常,当我们调整图像大小时,我们会从目的地开始,迭代 x、y,并在源中找到最佳匹配像素。在这里你想做相反的事情。迭代 x, y 中的源并写入目标缓冲区,以 0 为优先级(因此初始化为 0xFF,然后不要用其他值覆盖任何零),

工具包上不太可能有这样的功能,你必须自己动手。

于 2017-03-19T18:04:17.787 回答