簡體   English   中英

Python中的數字圖像裁剪

[英]Digital Image cropping in Python

從一位教授,一位物理學家那里得到了這個問題。

我是Python編程的初學者。 我不是計算機專業人士我是物理學家。 我試圖在python中編寫一個代碼用於我自己的研究,這涉及一些圖像處理。

我需要做的就是顯示圖像,然后使用鼠標選擇感興趣的區域,最后裁剪出所選區域。 我可以使用ginput()函數在Matlab中完成此操作。

我嘗試過使用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上,你想要破解Image.py底部的_showxv()方法來更改用於打開圖像的命令。

如果您確實需要提供便攜式解決方案,則需要使用UI框架來為裁剪應用程序提供支持。 的選擇歸結為Tkinter的 (ImageTk.py給你的包裝在Tk的顯示圖像PIL), PyQt4的 (ImageQt在PIL 1.1.6給您QT4顯示圖像的包裝紙)或wxPython的 (更高級別的應用程序編寫工具包使用wxWidgets)。 掌握完整的UI工具包將會有相當多的工作,但您將能夠完全自定義應用程序界面的工作方式。

在python中是否有像自動裁剪圖像的庫中的腳本: 自動裁剪圖像

您正在尋找的是模塊:matplotlib,它模擬Matlab。 請參閱ginput()函數。 這允許您找到邊界框,然后您可以使用PIL中的裁剪。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM