Pergunta

Got esta pergunta de um professor, um físico.

Eu sou um iniciante em programação Python. Eu não sou um profissional de computador Eu sou um físico. Eu estava tentando escrever um código em python para a minha própria investigação, que envolve um pouco de processamento de imagem.

Todos necessidade I a fazer é para exibir uma imagem e selecione uma região de interesse usando meu rato e, finalmente, cortar a região selecionada. Eu posso fazer isso em Matlab usando a função ginput ().

Eu tentei usar PIL. Mas acho que depois que eu emitir o Image.show comando (), a imagem é exibida, mas, em seguida, o programa pára lá a menos que eu sair da janela da imagem. Existe alguma maneira de implementar o que eu estava planejando. Preciso fazer download de qualquer outro módulo? Por favor informar.

Foi útil?

Solução

Embora concorde com David que você provavelmente deve apenas usar GIMP ou algum outro programa de manipulação de imagem, aqui é um script (como eu o levei para ser um exercício para o leitor), utilizando pygame que faz o que quiser. Você vai precisar instalar pygame, bem como o PIL, o uso seria:

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 isso ajude:)

Outras dicas

Por que vale a pena (provenientes de outro físico), gostaria apenas de fazer isso em um programa de processamento de imagem como o GIMP . A principal vantagem de fazer essa tarefa em Python (ou qualquer língua) seria para poupar tempo ao automatizar o processo, mas a menos que você - bem, o professor - pode de alguma forma desenvolver um algoritmo para automaticamente descobrir qual parte da imagem a colheita, não parece ser muito tempo para ser salvo por automação.

Se bem me lembro, GIMP é realmente programável, possivelmente com Python, por isso pode ser possível escrever um script GIMP de economia de tempo para fazer o seu amigo o professor quer.

Image.show () chamadas apenas o que quer que simples imagem telespectador que pode encontrar na plataforma atual, que pode ou não ter uma facilidade lavoura-and-save.

Se você estiver em uma caixa de Windows e você só precisa fazê-lo funcionar em sua máquina, defina o ‘Abrir com ...’ associação para torná-lo tão executando uma imagem carrega-o em um editor de sua escolha. No OS X e * nix que você gostaria de cortar o método _showxv () na parte inferior da Image.py para mudar o comando usado para abrir a imagem.

Se você realmente precisa para fornecer uma solução portátil, você vai precisar usar um quadro UI ao poder a sua aplicação de corte. As escolhas se resumem a Tkinter (ImageTk.py dá-lhe um invólucro para a exibição imagens PIL em Tk), PyQT4 (ImageQt em PIL 1.1.6 dá-lhe um dispositivo de moldagem para a exibição de imagens em QT4) ou wxPython (um nível mais alto de autoria aplicação kit de ferramentas usando wxWindows). Vai ser um pouco de trabalho para obter o jeito de um kit de interface do usuário completo, mas você vai ser capaz de personalizar completamente como a interface de seu aplicativo irá funcionar.

Existe um script em python como uma biblioteca para cortar imagens auto: automaticamente cortar imagem

O que você está procurando é o módulo: matplotlib, ele emula Matlab. Veja a função ginput (). Que permitem que você encontrar a caixa delimitadora, então você pode usar culturas de PIL.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top