Вопрос

Получил этот вопрос от профессора, физика.

Я новичок в программировании на Python.Я не компьютерщик, я физик.Я пытался написать код на Python для своего собственного исследования, которое включает в себя небольшую обработку изображений.

Все, что мне нужно сделать, это отобразить изображение, затем выбрать интересующую область с помощью мыши и, наконец, обрезать выбранную область.Я могу сделать это в Matlab, используя функцию ginput().

Я попробовал использовать PIL.Но я обнаружил, что после выполнения команды Image.show() изображение отображается, но затем программа останавливается, пока я не выйду из окна изображения.Есть ли способ реализовать то, что я планировал.Нужно ли мне скачивать какой-либо другой модуль?Пожалуйста, порекомендуйте.

Это было полезно?

Решение

Хотя я согласен с Дэвидом, что вам, вероятно, следует просто использовать GIMP или какую-либо другую программу для обработки изображений, вот сценарий (поскольку я воспринял его как упражнение для читателя), использующий pygame это делает то, что вы хотите.Вам нужно будет установить pygame, а также PIL, использование будет следующим:

scriptname.py <input_path> <output_path>

Фактический сценарий:

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

Надеюсь это поможет :)

Другие советы

Чего бы это ни стоило (от другого физика), я бы просто сделал это в программе обработки изображений, например GIMP.Основным преимуществом выполнения этой задачи на Python (или любом другом языке) будет экономия времени за счет автоматизации процесса, но если только вы — ну, профессор — не сможете каким-то образом разработать алгоритм, автоматически определяющий, какую часть изображения обрезать, похоже, что автоматизация не позволит сэкономить много времени.

Если я правильно помню, GIMP на самом деле поддерживает сценарии, возможно, с помощью Python, поэтому, возможно, можно будет написать сценарий GIMP, экономящий время, который будет делать то, что хочет ваш друг-профессор.

Image.show() просто вызывает любой простой просмотрщик изображений, который он может найти на текущей платформе, который может иметь или не иметь возможность обрезки и сохранения.

Если вы используете Windows и вам просто нужно заставить его работать на вашем компьютере, установите ассоциацию «Открыть с помощью...», чтобы при запуске изображения загружалось его в редактор по вашему выбору.В OS X и *nix вам нужно взломать метод _showxv() в нижней части Image.py, чтобы изменить команду, используемую для открытия изображения.

Если вам действительно необходимо предоставить портативное решение, вам потребуется использовать инфраструктуру пользовательского интерфейса для работы вашего приложения обрезки.Выбор сводится к Ткинтер (ImageTk.py предоставляет вам оболочку для отображения изображений PIL в Tk), PyQT4 (ImageQt в PIL 1.1.6 предоставляет вам оболочку для отображения изображений в QT4) или wxPython (набор инструментов более высокого уровня для разработки приложений с использованием wxWidgets).Чтобы освоить полный набор пользовательского интерфейса, потребуется немало усилий, но вы сможете полностью настроить работу интерфейса вашего приложения.

Есть ли в Python скрипт, подобный библиотеке, для автоматической обрезки изображений:Автоматически обрезать изображение

Вам нужен модуль:matplotlib, он эмулирует Matlab.См. функцию ginput().Это позволит вам найти ограничивающую рамку, а затем вы можете использовать обрезку из PIL.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top