我想找到两幅图像的直方图,并使用欧几里德距离找到相似度。我正在尝试使用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
答案 0 :(得分:6)
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);