- Adquisición Imagen : Recolección de fotos de los tableros (muestras).
- Preprocesamiento : Ajuste de tamaño y aplicación de filtros (estirar histograma).
- Segmentación : Identificación de los objetos (división de la imagen en zonas).
- Medición : Extracción de caracteristicas (nivel de gris de subconjuntos de puntos de la imagen).
- Interpretación : Clasificación (piedras negras, blancas, o vacío).
El proyecto consiste en un programa realizado en Scilab, utilizando la librería SIP, para el procesamiento de imágenes. Además, se utiliza el algoritmo de Harris, que permite detectar esquinas en una imagen. Las imágenes (fotos) utilizadas, fueron fotografías de un tamaño 160x121 pixeles, tomadas desde la perspectiva habitual que percibe un jugador de Go. El programa consiste en el archivo go.sci, junto a las funciones harris.sci, trans.sci, submatrix.sci, meanbox.sci.
Aparte del desarrollo del programa, una parte importante del proyecto constitió en la etapa de aprendizaje (el ajuste, manual, de los parámetros). Existe un conjunto de valores que fueron ajustados a medida que se probaban los ejemplos: los argumentos de la función harris, los valores de la deformación de la perspectiva, el umbral de discriminación (quizas el parámetro más importante).
El proceso de identificación de la posición, se compone de las siguientes etapas:


|
Downloads: - codigo fuente - librería SIP - ejemplos: tablero00.jpg, tablero01.jpg, tablero02.jpg, tablero03.jpg |
Notas:
- Para probar diversas imágenes, se debe cambiar el nombre de la imagen a utilizar, dentro del código fuente (tablero01.jpg), o renombrar el archivo de imagen a probar.
- Las imágenes de prueba utilizadas, son imágenes de 160x121 pixeles. Cada una debiera ser pre-procesada, estirando el histograma (ajuste de contraste) de la foto original. Para una mayor resolución, sería necesario aumentar el tamaño de memoria utilizado por el programa.
- El programa está hecho para un tablero de 9x9, sin embargo, debiera ser posible utilizar un tamaño mayor, ajustando el parámetro correspondiente (esta posibilidad no ha sido aún probada).
- Los tableros considerados, pueden tener hasta un cierto grado de distorsión, a partir de la vista superior del tablero. Deformaciones mayores (de perspectiva), producirían resultados erróneos.
- El problema más importante es el ruido que pueda aparecer en la imagen, básicamente en la forma de sombras y brillos. Esto puede hacer aparecer piedras ''fantasmas'' en lugares donde no existen piedras reales.
- El programa admite varias mejoras. Con entrenamiento se pueden ajustar aún más los valores de algunos parámetros, para mejorar su comportamiento. Mientras que el problema del ruido, representa el principal desafío para una siguiente etapa del proyecto.
Código Fuente:
| programa |
// GO - Programa que reconoce la posicion de las piedras de un tablero de go. |
| function harris |
// HARRIS - [cim, r, c] = harris(im, sigma, thresh, radius, disp) // im - image to be processed. // sigma - standard deviation of smoothing Gaussian. // thresh - threshold (optional). Try a value ~1000. // radius - radius of region considered in non-maximal suppression (optional). // disp - optional flag (0 or 1) indicating to display corners |
| function trans |
function [a, b] = trans(corners, x, y)
P00 = corners(1,:); P10 = corners(2,:);
P11 = corners(3,:); P01 = corners(4,:);
deltaXdw = P10(1) - P00(1);
deltaXup = P11(1) - P01(1);
deltaYdr = P11(2) - P10(2);
deltaYiz = P01(2) - P00(2);
a = (y*P01(1)+(1-y)*P00(1)) + (y*deltaXup+(1-y)*deltaXdw)*x;
b = (x*P10(2)+(1-x)*P00(2)) + (x*deltaYdr+(1-x)*deltaYiz)*y;
|
| function submatrix |
// retorna una submatriz de tamano [size x size], centrada en (i,j)
function aux = submatrix(m, i, j, siz)
n = size(m);
mid = (siz-1)/2;
if i>n(1) | i+siz>n(1)
i=n(1)-siz;
end
if j>n(2) | j+siz>n(2)
j=n(2)-siz;
end
if i-siz<0
i = siz;
end
if j-siz<0
j = siz;
end;
aux = m([i-mid:i+mid],[j-mid:j+mid])
|
| function meanbox |
// Para una matriz cuadrada, entrega la mediana(representante) de sus valores
function [val, meanv] = meanbox(m, n, threshold)
patterns = [0, 0, 0]; // negra(b), blanca(w), vacio(_)
for i = 1:n
for j = 1:n
if m(i,j) < (threshold-0.05) then patterns(1) = patterns(1) + 1;
elseif m(i,j) > 1-(threshold+0.0) then patterns(2) = patterns(2) + 1;
else patterns(3) = patterns(3) + 1;
end
end; end;
[mval, k] = maxi(patterns);
intensity = [0, 1, 0.5];
// devuelvo al representante de esta submatriz
val = intensity(k);
meanv = median(m);
|