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

을 나는 이미지 즉, 컬러 이미지가 된 것으로 추측하고있어를 3 개의 채널. 당신은 당신이, imhist을하기 전에 예를 벡터로 이미지를 늘릴 수있는 모든 색상 채널에서 작업 할 경우 그냥, 또는 .. 하나 개의 채널 그레이 스케일 이미지 할

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

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

등으로

그들을 줄이기 위해 do

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

실제로 히스토그램은 하나의 단일 채널에 대한 색조 값의 재분할을 나타 내기위한 것입니다. 컬러 이미지는 종종 3 채널 이미지입니다 (대부분의 경우 빨강, 초록, 파랑).

굿의 방법이 제대로 작동해야합니다. 당신이 더 정확하게하려면 각 채널을 추출하고 히스토그램 계산할 수 있습니다 :

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

당신은 지금 (각 채널에 대해 1) 3 개 유클리드 거리에 따라 평가 fonction을 정의 할 수 있습니다 :

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

따라서 거리 정의에서 한 가지 색상이나 다른 색상을 강조 할 수 있습니다. 테스트하려는 이미지에 특정 색상이있는 경우 유용 할 수 있습니다.

이것은 Ghaul의 방법에 대한 대안이지만 Andrey가 설명한 것처럼 Alpha, Beta 및 Gamma를 "0.2989 * R + 0.5870 * G + 0.1140 * B"로 설정하는 것과 같습니다.

+0

좋은 소식! 그러나 rgb2gray는 모든 채널을 같음으로 취급하지 않습니다. - "0.2989 * R + 0.5870 * G + 0.1140 * B" –

+0

좋아, 편집! – ibanez