在图像顶部提取热力图

4
我有一张像这样的图像 Heatmap with original image as background 和相应的背景图像。 Original image

我试图提取第一张图像的热图。我的第一个尝试是掩盖每个不“足够相等”的像素(阈值化每个像素之间的欧几里得距离),但结果不够好 Mask 看起来像是图像处理中的一个简单问题,但我缺乏经验。谢谢!

你知道热力图最初是通过哪种算法添加到图像上的吗? - Lara
这可能是你问题的答案:http://stackoverflow.com/questions/2139350/what-is-the-formula-for-extracting-the-src-from-a-calculated-blendmode - Dima
1个回答

4
获得准确的热力图是一个非常棘手的问题,因为热力图与不同透明级别的叠加。这意味着每个像素存在两个未知数:
1. 热力图本身 2. 透明度(它们是相关的,但精确映射是未知的)
如果只需要一个大致的分割,我建议通过颜色强度进行简单的阈值处理。您可以看到,热力图的强区域被强烈的蓝色所包围。
I = imread('https://istack.dev59.com/7oVZK.webp');

% Simple, manual color thresholding
mask1 = I(:,:,3) > 230 & I(:,:,1) < 30 & I(:,:,2) < 10;

现在我们扩大掩码以关闭蓝色热图边界中的任何空洞并填充这些空洞。
% Morphological processing
mask2 = imdilate(mask1, strel('disk',5,0));
mask2 = imfill(mask2, 'holes');

最后,我们可以提取热力图:
% Extract heat map
heat_map = I;
heat_map(~repmat(mask2,[1 1 3])) = 255;
imshow(heat_map)

这里是结果
enter image description here 编辑:如果你需要处理许多类似的图像,那么在hsv空间中执行分割可能更加稳健。
I_hsv = rgb2hsv(I);
mask1 = I_hsv(:,:,1) > 0.6 & I_hsv(:,:,1) < 0.7 & I_hsv(:,:,2) > 0.95 & I_hsv(:,:,3) > 0.9;

谢谢!顺便问一下,你能解释一下在HSV空间中的分割吗? - Black Arrow
当然。如果您想使用蓝色进行分割(如所示),则RGB空间中的阈值将取决于照明(亮度)。在HSV颜色空间中,您可以直接对色调值执行阈值处理,并对饱和度和值施加一些约束(显示在我的答案的最后一行)。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接