Algoritmo de Matlab para el cálculo de un mapa de disparidad a partir de pares de imágenes estéreo, utilizando la técnica de block matching.
La técnica de block matching consiste en la localización de un objeto conocido en una imagen. Se utiliza para ello un patrón o plantilla del objeto, que en general tendrá forma de bloque cuadrado (block), que se buscará en la imagen mediante un cálculo de similitud (matching).
En el caso de los mapas de disparidad, esta técnica se utiliza de la siguiente manera:
-Se recorre una de las imágenes del par estéreo, creando una plantilla con la vecindad de cada píxel.
-Se establece un rango de búsqueda de correspondencia, según la disparidad máxima del par estéreo. Para imágenes tomadas con un sistema canónico, además, puede limitarse la búsqueda a una única fila de la imagen, la misma que la del píxel que se está analizando, y con cámaras paralelas se tiene también que un píxel de la imagen izquierda tendrá su correspondencia, en la imagen derecha, siempre en una posición más a la izquierda.
-Dentro del rango de búsqueda, se analiza la similitud de la vecindad de cada pixel con la plantilla creada.
-El pixel de mayor similitud se considerará como la correspondencia con el pixel en análisis.
En la Figura 1 puede verse un ejemplo del resultado del algoritmo, probado en una imagen estéreo real tomada de un fotograma del cortometraje 3D Ikusezina.
![]() |
Figura 1: Resultados del algoritmo para un fotograma del cortometraje 3D Ikusezina |
Puede comprobarse que, aún con ciertos errores, se genera un mapa de disparidad más que aceptable, teniendo en cuenta la sencillez del algoritmo y la complejidad de la escena. En futuras revisiones del algoritmo se intentará conseguir un resultado más suavizado.
A continuación, el algoritmo:
------------------------------------------------------------------------------------------------------------
%% Este código calcula el mapa de disparidad de un par estéreo de imágenes.
%% Carga de imágenesIizda=im2double(rgb2gray(imread('izda.png')));Idcha=im2double(rgb2gray(imread('dcha.png')));
%% Inicialización parámetros:
% Matriz que contendrá el mapa de disparidad.
MapaDisparidad = zeros(size(Iizda));
% Rango de busqueda (número de pixeles al rededor del central). A mayor
% disparidad en una imagen, mayor el rango de busqueda necesario.
RangoBusqueda = 75;
% Tamaño del bloque que se usará.
BloqueMitad = 3;
Bloque = 2*BloqueMitad+1;
% Cell para los objetos TemplateMatcher que definirán la conducta del
% buscador de correspondencias con la plantilla.
Matchers = cell(Bloque);
%% Búsqueda del mapa de disparidad
% Se escanean todas las filas
Filas = size(Iizda, 1);
for i=1:Filas
% Límites por si el bloque está en un borde lateral de la imagen
minfila = max(1,i-BloqueMitad);
maxfila = min(Filas,i+BloqueMitad);
% Se escanean todas las columnas
for n=1:size(Iizda,2)
% Límites por si el bloque está en un bode sup/inf de la imagen
mincolumna = max(1,n-BloqueMitad);
maxcolumna = min(size(Iizda,2),n+BloqueMitad);
% Límites de búsqueda dados por el rango establecido
minbusqueda = max( -RangoBusqueda, 1-mincolumna );
maxbusqueda = min( RangoBusqueda, size(Iizda,2)-maxcolumna );
% Creación de una plantilla con la región de interés en imagen dcha
Plantilla = Idcha(minfila:maxfila,mincolumna:maxcolumna);
CentroPlantilla = floor((size(Plantilla)+1)/2);
% Se define la región interés como un rectángulo a partir de su
% esquina superior izquierda [x,y,ancho,alto}
RegionInteres = [mincolumna+CentroPlantilla(2)+minbusqueda-1 ...
minfila+CentroPlantilla(1)-1 ...
maxbusqueda-minbusqueda+1 1];
% Búsqueda de correspondencia de la plantilla en imagen izquierda
% Búsqueda del objeto TemplateMatcher apropiado (se crea si vacío)
% Se habilita la búsqueda de correspondencia únicamente en la
% región de interés (no en la imagen completa).
if isempty(Matchers{size(Plantilla,1),size(Plantilla,2)})
Matchers{size(Plantilla,1),size(Plantilla,2)} = ...
vision.TemplateMatcher('ROIInputPort',true);
end
MatcherActual = Matchers{size(Plantilla,1),size(Plantilla,2)};
% Búsqueda de correspondencias de la plantilla:
% Cálculo de loc = localización de coordenadas de la mejor
% correspondencia plantilla/imagen.
loc = step(MatcherActual, Iizda, Plantilla, RegionInteres);
MapaDisparidad(i,n) = loc(1) - RegionInteres(1) + minbusqueda;
end
endº
%% Representación resultado
figure(1)
imshow(MapaDisparidad,[]),
caxis([0 RangoBusqueda]);
title('Mapa de disparidad');
figure(2)
imshow(MapaDisparidad,[]), axis image, colormap('jet'), colorbar;
caxis([0 RangoBusqueda]);
title('Mapa de disparidad');
------------------------------------------------------------------------------------------------------------