2017-03-04 83 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