2011-03-29 34 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