2011-03-29 17 views
6

Quiero encontrar el histograma de dos imágenes y encontrar la similitud usando la distancia euclidiana. Estoy tratando de utilizar el comando imhist pero está dando el siguiente error:comparando dos imágenes usando el histograma

Error using ==> iptcheckinput 
Function IMHIST expected its first input, I or X, to be two-dimensional. 

mi código es el siguiente:

% 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 

Respuesta

5

supongo que sus imágenes son imágenes a color, es decir, tienen tres canales. Para reducirlos a uno imágenes en escala de grises de los canales hacer

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

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

etc ..

Alternativamente, si desea trabajar en todos los canales de color se puede estirar las imágenes en vectores antes de hacer imhist, es decir, justo do

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

De hecho, los histogramas están destinados a representar el reparto de valores tonales para un solo canal. Las imágenes en color a menudo son imágenes de 3 canales (Rojo, Verde, Azul en la mayoría de los casos).

El método de Ghaul debería funcionar correctamente. Si quieres ser más precisos, se puede extraer cada canal y calcular su histograma:

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

Ahora usted es capaz de definir una fonction de evaluación basado en las 3 distancias euclidianas (1 para cada canal):

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

Por lo tanto, puede poner énfasis en un color u otro en su definición de distancia. Eso podría ser útil si la imagen que desea probar tiene un color específico.

Esta es una alternativa al método de Ghaul, pero su equivalente sería establecer Alpha, Beta y Gamma como "0.2989 * R + 0.5870 * G + 0.1140 * B", como dijo Andrey.

+0

¡Buena publicación! Pero rgb2gray no trata a todos los canales como iguales. - "0.2989 * R + 0.5870 * G + 0.1140 * B" –

+0

¡Bien, editado! – ibanez

Cuestiones relacionadas