高档 whatershed 输出以匹配原始图像大小

Upscale whatershed output to match original image size

简介

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

问题:我无法正确重新缩放分割的输出到原始图像比例,两者都是为了可视化目的和其他 post 处理步骤。


最小工作示例

例如,我有这张图片:

我 运行 这个最小的脚本,我得到一个分水岭分割输出 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 图像?


解错

我尝试的第一种方法是使用 imresizeL 调整为原始比例。

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

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

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

我知道这是由于升级过程造成的模糊,但目前我想不出还有什么可以成功的。

我想到的唯一其他方法是使用数学形态学来 "enlarge" 调整大小的图像的边界,然后上采样,但这仍然会导致一些不需要的伪像。


TL;DR(或重述)

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

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

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

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

工具包上不太可能有执行此操作的功能,您必须自己动手。

如果你只需要放大图像后的分水岭段边界,那么只需做这些小改动:

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

这里是结果: