2011-03-29 104 views
6

我想要找到兩個圖像的直方圖並使用歐幾里得距離找到相似度。我試圖使用imhist命令,但它給了以下錯誤:使用直方圖比較兩個圖像

Error using ==> iptcheckinput 
Function IMHIST expected its first input, I or X, to be two-dimensional. 

我的代碼如下:

% read two images 
Im1 = imread('1.jpg'); 
Im2 = imread('2.jpg'); 

% convert images to type double (range from from 0 to 1 instead of from 0 to 255) 
Im1 = im2double(Im1); 
Im2 = im2double(Im2); 

% Calculate the Normalized Histogram of Image 1 and Image 2 
hn1 = imhist(Im1)./numel(Im1); 
hn2 = imhist(Im2)./numel(Im2); 

% Calculate the histogram error 
f = sum((hn1 - hn2).^2); 
f; %display the result to console 

回答

5

我猜,你的圖像是彩色圖像,即有三個頻道。爲了減少他們一個通道的灰度圖像做

Im1 = rgb2gray(Im1); 
Im2 = rgb2gray(Im2); 

hn1 = imhist(Im1)./numel(Im1); 
hn2 = imhist(Im2)./numel(Im2); 

等。

另外,如果你想在所有的顏色通道工作,你可以做imhist之前伸展你的圖像轉化爲向量,即只做

hn1 = imhist(Im1(:))./numel(Im1); 
hn2 = imhist(Im2(:))./numel(Im2); 
6

事實上,直方圖意味着代表一個單一通道的色調值的重新分配。彩色圖像通常是3通道圖像(大多數情況下爲紅色,綠色,藍色)。

Ghaul的方法應該工作得相當正確。如果你想更精確,你可以提取每一個通道,並計算其直方圖:

Red1 = Im1(:, :, 1); 
Green1 = Im1(:, :, 2); 
Blue1 = Im1(:, :, 3); 
HnBlue1 = imhist(Blue1)./numel(Blue1); 

您現在可以基於3個歐幾里得距離定義的評估fonction(1爲每個通道):

FBlue = sum((HnBlue1 - HnBlue2).^2); 
FRed= sum((HnRed1 - HnRed2).^2); 
... 
F = Alpha*FBlue + Beta*FRed + Gamma*FGreen //as an example 

因此,您可以將重點放在距離定義中的一種顏色或其他顏色上。如果要測試的圖像具有特定的顏色,這可能很有用。如Andrey所述,這是Ghaul方法的替代方案,但其等同方法是將Alpha,Beta和Gamma設置爲「0.2989 * R + 0.5870 * G + 0.1140 * B」。

+0

好帖子!但rgb2gray並未將所有頻道視爲平等。 - 「0.2989 * R + 0.5870 * G + 0.1140 * B」 – 2012-02-03 08:59:23

+0

好,編輯! – ibanez 2012-08-29 09:04:48