Обрезка цифрового изображения в Python
-
03-07-2019 - |
Вопрос
Получил этот вопрос от профессора, физика.
Я новичок в программировании на 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.