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

标签 matlab image-processing image-resizing watershed

简介

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

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


最小工作示例

例如,我有这张图片:

enter image description here

我运行这个最小的脚本,我得到一个分水岭分割输出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 的上采样会产生一系列不需要的伪像。它尤其会丢失一些代表图像片段之间边界的基本。这就是我的意思:

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

enter image description here enter image description here

我知道这是由于放大过程造成的模糊,但现在我想不出还有什么可以成功的。

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


TL;DR(或重述)

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

最佳答案

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

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

这里是结果:

enter image description here enter image description here

关于matlab - 高档 whatershed 输出以匹配原始图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42889867/

相关文章:

c# - 如何在 WinRt App 中将 WriteableBitmap 图像转换为字节数组

c++ - 自动阈值分割

css - CSS3中自动调整图像效果

c# - 如何调整图像大小并保存在文件夹中?

image - 如何相对于另一个轴定位图形中的轴?

matlab - 无法在 MATLAB 中加载库

algorithm - MATLAB:提高逻辑语句中的代码效率(Metropolis 方法)

c++ - 如何在 'nmixures' 中设置 'bShadowDetection' 和 'BackgroundSubtractorMOG2' 值?

PHP GD调整透明图像大小给黑色边框

debugging - 查找在复杂程序中创建命令行输出的位置