Question

Vous avez cette question d'un professeur, un physicien.

Je suis un débutant en programmation Python. Je ne suis pas un professionnel de l'informatique, je suis un physicien. J'essayais d'écrire un code en python pour mes propres recherches, qui impliquait un peu de traitement d'image.

Tout ce que je dois faire, c'est afficher une image, puis sélectionner une région d'intérêt à l'aide de la souris et enfin rogner la région sélectionnée. Je peux le faire dans Matlab en utilisant la fonction ginput ().

J'ai essayé d'utiliser PIL. Mais je trouve qu'après avoir lancé la commande Image.show (), l'image est affichée mais le programme s'arrête là sauf si je quitte la fenêtre d'image. Y at-il un moyen de mettre en œuvre ce que je prévoyais. Dois-je télécharger un autre module? S'il vous plaît donnez votre avis.

Était-ce utile?

La solution

Bien que je sois d’accord avec David pour dire que vous devriez probablement utiliser simplement GIMP ou un autre programme de manipulation d’images, voici un script (comme je l’ai compris pour le lecteur) utilisant pygame qui fait ce que vous voulez. Vous aurez besoin d’installer pygame ainsi que le PIL, l’utilisation serait:

scriptname.py <input_path> <output_path>

Script actuel:

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

J'espère que cela vous aidera:)

Autres conseils

Pour ce que ça vaut (venant d'un autre physicien), je le ferais simplement dans un programme de traitement d'images comme GIMP . Le principal avantage de cette tâche en Python (ou dans n’importe quel langage) serait de gagner du temps en automatisant le processus, mais à moins que le professeur ne puisse développer un algorithme pour déterminer automatiquement la partie de l’image à rogner, il ne semble pas y avoir beaucoup de temps pour être sauvé par l'automatisation.

Si je me souviens bien, GIMP est réellement scriptable, éventuellement avec Python. Il serait donc possible d'écrire un script GIMP permettant de gagner du temps pour faire ce que veut votre ami professeur.

Image.show () appelle simplement n'importe quel visualiseur d'images simple qu'il peut trouver sur la plate-forme actuelle, avec une installation qui peut ou non disposer d'une fonction de recadrage et d'enregistrement.

Si vous utilisez une boîte de dialogue Windows et que vous avez juste besoin de la faire fonctionner sur votre ordinateur, définissez l'association "Ouvrir avec ..." pour qu'elle s'exécute de telle sorte que l'exécution d'une image la charge dans l'éditeur de votre choix. Sous OS X et * nix, vous voudrez pirater la méthode _showxv () au bas de Image.py pour changer la commande utilisée pour ouvrir l'image.

Si vous devez réellement fournir une solution portable, vous devez utiliser un framework d'interface utilisateur pour alimenter votre application de recadrage. Les choix se résument à Tkinter (ImageTk.py vous donne un wrapper pour afficher Images PIL en Tk), PyQT4 (ImageQt dans PIL 1.1.6 vous donne un wrapper permettant d'afficher des images dans QT4) ou wxPython (une boîte à outils de création d'application de niveau supérieur utilisant wxWidgets). Ce sera un peu fastidieux de maîtriser un kit d'interface utilisateur complet, mais vous pourrez complètement personnaliser le fonctionnement de l'interface de votre application.

Existe-t-il un script en python semblable à une bibliothèque pour rogner automatiquement les images: Recadrer l'image automatiquement

Ce que vous recherchez, c'est le module: matplotlib, il émule Matlab. Voir la fonction ginput (). Cela vous permet de trouver le cadre de sélection, vous pouvez alors utiliser le recadrage de PIL.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top