2013-07-22 71 views
2

我使用下面的代码来计算欧几里得距离两个RGB图像:
计算HSV颜色空间中的两个图像的欧氏距离在MATLAB

Im1 = imread(filename1); 
Im1 = rgb2gray(Im1); 
hn1 = imhist(Im1)./numel(Im1); 
Im2 = imread(filename2); 
Im2 = rgb2gray(Im2); 
hn2 = imhist(Im2)./numel(Im2); 
f = norm(hn1-hn2); 

,它给了我正确的答案
,但现在我想要在hsv色彩模式下使用两个图像的代码,但它不会在其上工作
导致以上所有代码都在2d空间,而hsv是1d
是否有任何特定的代码用于计算两个图像的欧几里德距离hsv色彩空间? 图像格式为JPG

回答

2

你需要为每个通道直方图seperatetly

function hst = im2hsvHist(img) 
% 
% computes three channels histogram in HSV color space 
% 
n = 256; % number of bins per hist (per channel) 
hsvImg = rgb2hsv(img); 
hst = zeros(n,3); 
for ci = 1:3 
    hst(:,ci) = imhist(hsvImg(:,:,ci) , n); 
end 
hst = hst(:) ./ n; % to 3*n vector, normalize by n and not 3n 

使用此功能,您可以计算在HSV空间

Im1 = imread(filename1); 
hst1 = im2hsvHist(Im1); 
Im2 = imread(filename2); 
hst2 = im2hsvDist(Im2); 
f = norm(hst1 - hst2); 

偷偷的图像像距查看im2hsvHist的矢量化版本:

n = 256;
hsvImg = rgb2hsv(img);
hst = hist(reshape(hsvImg,[],3),255); %而不是循环!
hst = hst(:)/n;

+0

非常感谢。这非常有帮助。我可以问另一个关于第一部分的问题((im2hsvHist))。我有rgb中的图像我将它们转换为hsv的代码,我在这个问题中提到:http://stackoverflow.com/questions/17724689/a-color-histogram-algorithm-in-matlab does im2hsvHist do same事情?再次感谢你 – samdean

+0

@samdean - 两种解决方案都使用'rgb2hsv'将rgb色彩空间转换为hsv色彩空间。你提出的问题只使用hsv色彩空间的“Hue”通道。这相当于在我的函数'im2hsvHist'中运行'ci'循环仅用于'ci = 1' - Hue通道。 – Shai

+0

@samdean欢迎来到stackoverflow。如果它真的回答你的问题,这里是“接受”答案。您通过点击旁边的“V”图标来“接受”答案。考虑这样做也是你之前提到的问题http://stackoverflow.com/questions/17724689/a-color-histogram-algorithm-in-matlab。 – Shai