使用直方图比较两个图像

时间:2011-03-29 16:30:38

标签: matlab

我想找到两幅图像的直方图,并使用欧几里德距离找到相似度。我正在尝试使用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

2 个答案:

答案 0 :(得分:6)

实际上,直方图意味着表示单个通道的色调值的重新分配。彩色图像通常是3通道图像(大多数情况下为红色,绿色,蓝色)。

Ghaul的方法应该非常正确。如果您想更精确,可以提取每个通道并计算其直方图:

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

您现在可以根据3个欧氏距离(每个通道1个)定义评估函数:

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

因此,您可以将重点放在距离定义中的一种颜色或另一种颜色上。如果您要测试的图像具有特定颜色,那么这可能很有用。

这是Ghaul方法的替代品,但它的等价物是将Alpha,Beta和Gamma设置为“0.2989 * R + 0.5870 * G + 0.1140 * B”,正如安德烈所述。

答案 1 :(得分:5)

我猜你的图像是彩色图像,即有三个通道。要将它们减少到一个通道灰度图像

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

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

等。

或者,如果您想处理所有颜色通道,可以在进行模拟之前将图像拉伸为矢量,即只需执行

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