介绍
背景:我正在使用watershed
MATLAB 中的算法分割图像。对于内存和时间限制,我更喜欢对二次采样图像执行此分割,假设调整大小为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 中对缩小的图像执行,然后将结果放大到原始图像,保持算法输出的清晰区域边界?我在寻找一个完全荒谬的问题吗?