Pregunta

Recibí esta pregunta de un profesor, un físico.

Soy un principiante en la programación de Python. No soy un profesional de la informática, soy un físico. Estaba tratando de escribir un código en Python para mi propia investigación que implica un pequeño procesamiento de imágenes.

Todo lo que necesito hacer es mostrar una imagen y luego seleccionar una región de interés usando mi mouse y finalmente recortar la región seleccionada. Puedo hacer esto en Matlab usando la función ginput ().

Intenté usar PIL. Pero encuentro que después de emitir el comando Image.show (), se muestra la imagen pero luego el programa se detiene allí a menos que salga de la ventana de imagen. ¿Hay alguna manera de implementar lo que estaba planeando? ¿Necesito descargar algún otro módulo? Por favor avise.

¿Fue útil?

Solución

Si bien estoy de acuerdo con David en que probablemente solo deberías usar GIMP o algún otro programa de manipulación de imágenes, aquí hay un script (como lo tomé como un ejercicio para el lector) usando pygame que hace lo que quieres. Deberá instalar Pygame y PIL, el uso sería:

scriptname.py <input_path> <output_path>

Script real:

import pygame, sys
from PIL import Image
pygame.init()

def displayImage( screen, px, topleft):
    screen.blit(px, px.get_rect())
    if topleft:
        pygame.draw.rect( screen, (128,128,128), pygame.Rect(topleft[0], topleft[1], pygame.mouse.get_pos()[0] - topleft[0], pygame.mouse.get_pos()[1] - topleft[1]))
    pygame.display.flip()

def setup(path):
    px = pygame.image.load(path)
    screen = pygame.display.set_mode( px.get_rect()[2:] )
    screen.blit(px, px.get_rect())
    pygame.display.flip()
    return screen, px

def mainLoop(screen, px):
    topleft = None
    bottomright = None
    runProgram = True
    while runProgram:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                runProgram = False
            elif event.type == pygame.MOUSEBUTTONUP:
                if not topleft:
                    topleft = event.pos
                else:
                    bottomright = event.pos
                    runProgram = False
        displayImage(screen, px, topleft)
    return ( topleft + bottomright )


if __name__ == "__main__":
    screen, px = setup(sys.argv[1])
    left, upper, right, lower = mainLoop(screen, px)
    im = Image.open(sys.argv[1])
    im = im.crop(( left, upper, right, lower))
    im.save(sys.argv[2])

Espero que esto ayude :)

Otros consejos

Por lo que vale (viniendo de otro físico), simplemente haría esto en un programa de procesamiento de imágenes como el GIMP . El principal beneficio de realizar esta tarea en Python (o en cualquier lenguaje) sería ahorrar tiempo automatizando el proceso, pero a menos que usted, bueno, el profesor, pueda desarrollar de alguna manera un algoritmo para descubrir automáticamente qué parte de la imagen recortar, no parece haber mucho tiempo para ser ahorrado por la automatización.

Si no recuerdo mal, GIMP es en realidad programable, posiblemente con Python, por lo que podría ser posible escribir un script GIMP que ahorre tiempo para hacer lo que tu amigo profesor quiere.

Image.show () simplemente llama a cualquier visor de imágenes simple que pueda encontrar en la plataforma actual, uno que puede tener o no tener una función de cortar y guardar.

Si está en un cuadro de Windows y solo necesita que funcione en su máquina, configure la asociación "Abrir con ..." para que la ejecución de una imagen la cargue en un editor de su elección. En OS X y * nix, querrás hackear el método _showxv () en la parte inferior de Image.py para cambiar el comando utilizado para abrir la imagen.

Si realmente necesita proporcionar una solución portátil, deberá usar un marco de interfaz de usuario para impulsar su aplicación de recorte. Las opciones se reducen a Tkinter (ImageTk.py le ofrece un contenedor para mostrar Imágenes PIL en Tk), PyQT4 (ImageQt en PIL 1.1.6 le ofrece un contenedor para mostrar imágenes en QT4) o wxPython (un kit de herramientas de creación de aplicaciones de nivel superior con wxWidgets). Será bastante difícil dominar un kit de interfaz de usuario completo, pero podrá personalizar completamente cómo funcionará la interfaz de su aplicación.

¿Hay un script en Python como una biblioteca para recortar automáticamente las imágenes: Recortar automáticamente la imagen

Lo que está buscando es el módulo: matplotlib, emula a Matlab. Vea la función ginput (). Eso le permite encontrar el cuadro delimitador, luego puede usar recortar desde PIL.

http://matplotlib.sourceforge.net/api/figure_api.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top