PDA

Ver la Versión Completa : Reconocimiento de Imagenes


Esau
28-08-2008, 05:26:59
Hola Foro:

Les cuento que necesito de vuestra ayuda para solucionar un pequeño problema que me han propuesto.

Les cuento un poco para poderlos ubicar.
En mi oficina estamos escaneando documentos en grandes volúmenes, para subirlos a nuestras bases de datos.

Cada registro tiene un numero no determinado de imágenes pueden ser 4,3,2, o solo una imagen, eso no lo sabemos,
El punto es que para poder escanearlas entre grupo de imágenes que le pertenecen a un solo registro hemos puesto un separador de documentos que es una imagen con seis bloques mas o menos como se muestra en el archivo adjunto:

Es decir que en el directorio donde se almacenan las imágenes, luego de escanearlas, tenemos archivos correlativos en nombres más o menos de esta forma:
0001.tif
0002.tif  este es el separador de documentos:
0003.tif
0004.tif
0005.tif  este es el separador de documentos:
0006.tif
0007.tif
0008.tif
0009.tif  este es el separador de documentos:

La idea es bien simple: cuando subo las imágenes con los registros hago esto:
Para el primer registro le corresponde la imagen 0001,
Salto la imagen que uso como separador
Para el segundo registro le corresponde las imágenes 0003 y 0004.
Salto la imagen que uso como separador.
Para el tercer registro le corresponde la imagen 0006, 0007 y 0008.
Vuelvo a saltar la imagen y continúo sucesivamente…

Bien el problema es el siguiente:

Que no tengo como reconocer la imagen separadora.
Hasta el momento he suplido el problema agregando un campo en cada registro que dice número de imágenes y el digitador debe contar las imágenes y ponerlos en el campo correspondiente, pero eso es susceptible a errores.
La idea es subir los registros con las imágenes y que por medio de un algoritmo de reconocimiento de imágenes se pueda realizar el salto correspondiente.
Hasta el momento todos mis intentos han sido infructuosos:
La idea que me esta dando vueltas por la cabeza pero que aun no puedo implementar seria dividir cada cuadro y sacar una muestra del cuadro en cuestión y revisar todos los Pixeles y preguntar si es blanco o negro de acuerdo a cada cuadro que se esta examinando:
Todas las imágenes separadoras son de blanco y negro y utilizo el formato Tif para guardarlas.
La idea es crear una función que nos devuelva verdadero si la imagen que se esta examinando es un separador y falso si es que no lo es.
De esta forma podríamos subir grandes cantidades de imágenes con sus registros sin necesidad de poner el número de imágenes en un campo.
Bueno la Ayuda por parte de Uds. si la conocen seria como saber si la imagen que se esta examinando es un separador o no. El problema es que no tengo idea de cómo hacer el algoritmo.

Saludos cordiales,

ElDioni
28-08-2008, 08:19:52
No se que cosas has probado ya, pero a mi, a bote pronto, se me ocurre que tu tengas un TImage con la imagen de separación cargada y en otro TImage vayas cargando las imagenes que quieres montar, vas comparando las imagenes y si coincide ya sabes que es la de separacion.
Te pongo un hilo donde se habla de como comparar dos imagenes que espero te ayude.

http://www.clubdelphi.com/foros/showthread.php?t=38698&highlight=comparar

Un saludo

coso
28-08-2008, 10:56:51
hola, la funcion deberia recorrer cada pixel por cuadrado y ir mirando si debe ser blanco o negro, algo asi como


function iguales : boolean;
var
i, j : integer;
col, row : integer;
const
tamanyo_cuadro : integer = 30;
begin
for i := 0 to Image1.Width do
for j := 0 to image1.Height do
begin
col := i div tamanyo_cuadro; // 0,1
row := j div tamanyo_cuadro; // 0,1,2
if (col + row) mod 2 = 0 then c := clBlack else c := clWhite;
if not Image1.Canvas.Pixels[i,j] = c then begin iguales := false; exit; end;
end;
iguales := true;
end;

duilioisola
28-08-2008, 11:05:44
Si el separador tiene solo 6 pixels (por lo que veo en la imagen adjunta 2x3) y el resto de imágenes escaneadas son más grandes, podrías saber que es un separador porque la imagen es pequeña.

if (TamanoImagen<7) then
EsSeparador
else
NoEsSeparador

También podrías saber que el separador es de 3 pixeles de alto por 2 de ancho.
Si la imagen que llega es de 3x2, sabrás que es el separador.
if (Image1.Picture.Bitmap.Width = 2) and
(Image1.Picture.Bitmap.Height = 3) then
EsSeparador;
else
NoEsSeparador;