简介
背景:我正在使用MATLAB中的watershed
算法对图像进行分割。对于内存和时间限制,我更喜欢对子采样图像执行分段,让我们说调整因子为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(或回顾)
有没有办法在MATLAB中的缩小图像上执行watershed
,然后将结果放大到原始图像,保持算法输出的清晰区域边界?我正在寻找一个完全荒谬的问题吗?
答案 0 :(得分:2)
如果您在升级图像后只需要分水岭区域边框,那么只需进行一些小改动:
L_big = ~imresize(L==0, [size(im_orig,1), size(im_orig,2)]); % Upsample L
,结果如下:
答案 1 :(得分:1)
调整大小时可以使用最近邻插值:
L_big = imresize(L, [size(im_orig,1), size(im_orig,2)],'nearest'); % Upsample L
答案 2 :(得分:0)
通常情况下,当我们调整图像大小时,我们会向目标星标,迭代x,y,并找到源中最匹配的像素。在这里你想要反过来。迭代x,y中的源并写入目标缓冲区,0取优先级(因此初始化为0xFF,然后不要用其他值覆盖任何零),
在工具包上不太可能有这样的功能,你可以自己滚动。