viernes, 19 de julio de 2013

Detector de similitud de imagenes

Es muy útil poder cuantificar la similitud entre dos imagines para todo sistema de visión por computadora. Uno de los algoritmos más utilizados por su sencillez y efectividad es el Coeficiente de Correlación de Pearson. Si consideremos a una imagen digital como una muestra de datos de un evento "aleatorio", podemos reescribir el coeficiente de la siguiente forma:

donde el numerador representa a la covariancia de los datos (valores de los pixeles) de la imagen A y B y el denominador es el producto de la desviación estándar de los datos de la imagen A por la desviación estándar de los de la imagen B. Podemos implementar un detector de similitud en Matlab. Antes, hay que mencionar algunas características de la función cov(). Supongamos que tenemos dos conjuntos de datos:

x = [ 1 3 4 6 7 4];
y = [ 6 7 1 4 9 8];

Si queremos obtener la covariancia entre ambos conjuntos utilzando cov(x,y), lo primero que hará la función es concatenar ambos vectores de la siguiente manera:

 [x     y ]

1     6
3     7
4     1
6     4
7     9
4     8

La función cov() dará como resultado una matriz donde la posición (1,1) es la covarianza de la primer columna consigo misma, (1,2) es la covarianza de la primera con la segunda, (2,1) la segunda con la primera y (2,2) la segunda consigo misma:

>> cov(x,y)

ans =

    4.5667    0.8333
    0.8333    8.5667

En este caso las únicas posiciones que nos interesan son la (1,2) o la (2,1). Conociendo este detalle podemos implementar sin problemas un algoritmo de detección de similitud de la siguiente forma:


% Carga de imagenes
I = imread('dali.jpg');
I2 = imread('dali6.jpg');

subplot(1,2,1),imshow(I),title('Imagen A')
subplot(1,2,2), imshow(I2),title('Imagen B')

% Conversion a escala de grises y escalamiento

Is = rgb2gray(I);
[n m] = size(Is);
I2 = imresize(I2,[n m]);
I = rgb2gray(I);
I = double(I);
I2 = rgb2gray(I2);

% Cambio de forma matricial a vector y cambio de formato
Ir = reshape(I, [1 numel(I)]);
Ir = double(Ir);
Ir2 = reshape(I2, [1 numel(I2)]);
Ir2 = double(Ir2);

% Cálculo del CCP

Sx = std(Ir);
Sy = std(Ir2);
Cxym = cov(Ir,Ir2);
Cxy = Cxym(2,1);
p = Cxy/(Sx*Sy)

if p > 0.7
   
    disp('La imagen es la misma')
   
else
   
    disp('Las imagenes son diferentes')
   
end

No hay comentarios: