Esta pregunta es un tanto independiente del idioma, pero mi herramienta de elección pasa a ser una matriz numpy.regiones en blanco en la imagen
Lo que estoy haciendo es tomar la diferencia de dos imágenes a través de PIL:
img = ImageChops.difference(img1, img2)
Y quiero encontrar las regiones rectangulares que contienen cambios de una imagen a otra. Por supuesto está el método construido en .getbbox()
, pero si hay dos regiones con cambios devolverá un cuadro de una región a otra, y si solo hay 1 cambio de píxel en cada esquina, devolverá la imagen completa.
Por ejemplo considere el siguiente, donde o
es un píxel distinto de cero:
______________________
|o ooo |
| oooo ooo |
| o |
| o o |
| |
| oo o |
| o o ooo |
| oo ooooo |
| ooo |
| o |
|____________________|
me gustaría llegar 4x4-tuplas que contienen los cuadros delimitadores de cada región que no sea cero. Para el caso borde de la estructura
oooo
o
o o
, no estoy muy preocupado cómo lo maneja - ya sea con dos secciones por separado o juntos, porque los límites de la forma invertida-L se solapan por completo los límites de la sola pixel
Nunca he hecho algo así de avanzado con el procesamiento de imágenes, así que quería obtener algo de información antes de escribir algo (y si hay métodos preexistentes en los módulos que ya uso, ¡los recibo!) .
Mi versión psuedocode-ish es algo como esto:
for line in image:
started = False
for pixel in line:
if pixel and not started:
started = True
save start coords
elif started and not pixel:
started = False
save end coords (x - 1 of course)
Esto me debe dar una lista de coordenadas, pero luego tengo que determinar si las regiones son contiguas. ¿Podría hacer eso con una búsqueda de tipo gráfico? (Hicimos mucho DFS y BFS en Algoritmos el semestre pasado) Por supuesto que creo que podría hacer eso en lugar de/junto con mis ciclos anteriores?
no voy a estar haciendo esto en imágenes "grandes" - que están sacados de una cámara web y el mejor momento tengo hace 640x480. A lo sumo estaría haciendo 720p o 1080p, pero eso es lo suficientemente lejos en el futuro como para que no sea una preocupación real.
Así que mi pregunta (s): ¿Soy yo nos dirigimos por el camino correcto, o estoy muy lejos? Y más importante, ¿hay funciones integradas que me impidan reinventar la rueda? Y finalmente, ¿hay algún buen recurso que debería considerar (tutoriales, documentos, etc.) que ayude aquí?
Gracias!
Holy Smokes ¡eso es perfecto! Eso es exactamente lo que quería, y creo que en realidad prefiero manejar el caso extremo de esa manera, de esa manera realmente obtendrá los cuadros para * todos * los píxeles. ¡Ojalá pudiera votar más de una vez! –
@Wayne - ¡Me alegra ayudar! Hay un buen lote de funciones en scipy.ndimage, una vez que aprendes cómo encadenar a los diversos operadores. ¡Buena suerte! –
@JoeKington es uno de los programadores más útiles por ahí – chimpsarehungry