2010-11-20 12 views
6

Supongamos que tengo una imagen con, digamos, un círculo y un cuadrado. ¿Hay alguna manera de encontrar el cuadrado dada la matriz de la imagen? (solo hay un cuadrado, y el tiempo no es realmente un problema). Gracias.Algoritmo para encontrar una forma cuadrada en una imagen?

+1

¿Es un cuadrado perfecto, o "cuadrado"? –

+1

Rectángulo, para ser precisos. Pero es bastante vainilla. Supongamos que se ha dibujado con la herramienta "Cuadrada" de MS Paint, y luego se guarda como gif. –

+1

¿Está alineado el cuadrado con los ejes o gira? – thejh

Respuesta

3

Vamos a dividir todos los puntos en "iluminado" y "oscuro".

Busque puntos que estén iluminados, y los puntos arriba y abajo también estén iluminados. Es probable que sean parte de una ventaja.

De forma similar: si un punto (x, y) está iluminado y los puntos (x + 1, y), (x + 2, y) también están iluminados, pero (x-1, y) y (y-1 , y) son oscuros, y análogamente en la dirección Y, entonces es muy probable que hayas encontrado una esquina superior izquierda. Y así. De esta forma puedes encontrar las esquinas y luego encontrar el cuadrado a partir de ellas, parece ser un enfoque simple.

0

Si el cuadrado de la imagen es perfecto, verifique que haya un borde en la posición esperada. El pseudocódigo en la respuesta de Thejh debería funcionar bien.

+0

Gracias, Gintautas. Perdón por preguntarte esto, pero ¿podrías ser un poco más formal? Algunas matemáticas, o pseudo-código tal vez? Tengo problemas para analizar la oración. Gracias. –

+0

Sí, mi primera oración se rompió, lo siento. Fijación. –

+0

He entendido mal tu pregunta, pensé que estabas buscando un rectángulo lleno en lugar de solo el contorno, como lo proporciona la herramienta "Rectángulo" de Paint. En este caso, la solución es mucho más simple. –

3

¿Algo como esto?

for (x,y of every black pixel) { 
#those methods should return true if the lines length is more than one pixel 
if (hasLineToRight(x,y)&&hasLineToBottom(x,y)) { 
    otherx=highestXOfLineToRight(); 
    othery=highestYOfLineToBottom(); 
    if (isLine(x,y,x,othery)&&isLine(x,y,otherx,y)) { 
    addBoxToList(x,y,otherx,othery); 
    } 
} 
} 

box image

Usted además probablemente quieren usar la caja con los más altos valores de anchura y altura.

0

¿Qué hay de flood filling comenzando en puntos al azar hasta que encuentre su rectángulo?

Cuestiones relacionadas