Domanda

Ho ricevuto questa domanda da un professore, un fisico.

Sono un principiante nella programmazione Python. Non sono un professionista del computer, sono un fisico. Stavo cercando di scrivere un codice in Python per la mia ricerca che comporta una piccola elaborazione delle immagini.

Tutto quello che devo fare è visualizzare un'immagine, quindi selezionare una regione di interesse usando il mouse e infine ritagliare la regione selezionata. Posso farlo in Matlab usando la funzione ginput ().

Ho provato a usare PIL. Ma trovo che dopo aver emesso il comando Image.show (), l'immagine viene visualizzata ma il programma si ferma lì a meno che non esca dalla finestra dell'immagine. Esiste un modo per attuare ciò che stavo pianificando. Devo scaricare altri moduli? Si prega di avvisare.

È stato utile?

Soluzione

Mentre sono d'accordo con David sul fatto che probabilmente dovresti semplicemente usare GIMP o qualche altro programma di manipolazione delle immagini, ecco uno script (dato che l'ho considerato un esercizio per il lettore) usando pygame che fa quello che vuoi. Dovrai installare pygame e il PIL, l'utilizzo sarebbe:

scriptname.py <input_path> <output_path>

Script effettivo:

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])

Spero che questo aiuti :)

Altri suggerimenti

Per quello che vale (proveniente da un altro fisico), lo farei semplicemente in un programma di elaborazione delle immagini come GIMP . Il vantaggio principale di svolgere questa attività in Python (o in qualsiasi lingua) sarebbe quello di risparmiare tempo automatizzando il processo, ma a meno che tu - beh, il professore - non sia in qualche modo in grado di sviluppare un algoritmo per capire automaticamente quale parte dell'immagine ritagliare, non sembra esserci molto tempo per essere salvati dall'automazione.

Se ricordo bene, GIMP è effettivamente scriptabile, possibilmente con Python, quindi potrebbe essere possibile scrivere uno script GIMP che fa risparmiare tempo per fare ciò che vuole il tuo amico professore.

Image.show () chiama semplicemente qualsiasi visualizzatore di immagini semplice che possa trovare sulla piattaforma attuale, uno che può o meno avere una funzione di ritaglio e salvataggio.

Se sei su una finestra di Windows e devi solo farlo funzionare sul tuo computer, imposta l'associazione "Apri con ..." per farlo in modo che l'esecuzione di un'immagine lo carichi in un editor a tua scelta. Su OS X e * nix vorresti hackerare il metodo _showxv () nella parte inferiore di Image.py per cambiare il comando usato per aprire l'immagine.

Se in realtà è necessario fornire una soluzione portatile, sarà necessario utilizzare un framework UI per alimentare l'applicazione di ritaglio. Le scelte si riducono a Tkinter (ImageTk.py ti offre un wrapper per la visualizzazione Immagini PIL in Tk), PyQT4 (ImageQt in PIL 1.1.6 ti dà un wrapper per la visualizzazione di immagini in QT4) o wxPython (un toolkit di creazione di applicazioni di livello superiore che utilizza wxWidgets). Ci vorrà un po 'di lavoro per appendere un kit UI completo, ma sarai in grado di personalizzare completamente il funzionamento dell'interfaccia dell'applicazione.

Esiste uno script in Python come una libreria per ritagliare automaticamente le immagini: Ritaglia automaticamente l'immagine

Quello che stai cercando è il modulo: matplotlib, emula Matlab. Vedi la funzione ginput (). Ciò ti consente di trovare il rettangolo di selezione, quindi puoi utilizzare il ritaglio da PIL.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top