2017-03-04 81 views
3

我有这样的图像 Heatmap with original image as background 和相应的背景图像。 Original image在图像顶部提取热图

我想提取第一个图像的热图。我的第一个方法是掩盖,这是不是“等于不够”(阈值处理每一个像素之间的欧氏距离)的每一个像素,但效果还不够好 Mask

看起来像在图像处理一个简单的问题,但我缺乏经验。谢谢!

+0

你有没有通过算法热图最初添加任何想法到图像上? – Wysaard

+0

这可能是您的问题的答案:http://stackoverflow.com/questions/2139350/what-is-the-formula-for-extracting-the-src-from-a-calculated-blendmode – Dima

回答

4

获取的确切热图是一个高度非平凡问题,因为热图用的透明度不同水平的重叠。
这意味着每个像素有两个未知数

  1. 热图本身和
  2. 透明度(它们链接但确切的映射是未知的)。

如果粗略的分割足够了,我建议通过颜色强度进行简单的阈值处理。你可以看到,热图的强区是由一个强大的,蓝色包围:

I = imread('https://i.stack.imgur.com/7oVZK.png'); 

% 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) 

这里是Result
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; 
+0

谢谢!顺便说一句,你能解释更多关于HSV空间分割吗? –

+0

当然。如果您想使用蓝色进行分割(如图所示),那么RGB空间中的阈值将取决于照明(亮度)。在[HSV](https://en.wikipedia.org/wiki/HSL_and_HSV)颜色空间中,您可以直接对色调值执行阈值处理,并对饱和度和值进行一些限制(显示在我的答案的最后一行)。 – Richard