高档 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
图像?
解错
我尝试的第一种方法是使用 imresize
将 L
调整为原始比例。
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
这里是结果:
简介
背景:我在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
图像?
解错
我尝试的第一种方法是使用 imresize
将 L
调整为原始比例。
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
这里是结果: