2009-03-02 79 views
4

從教授,物理學家那裏得到了這個問題。Python中的數字圖像裁剪

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

所有我需要做的是顯示圖像,然後用我的鼠標選擇感興趣的區域,最後裁剪掉選定的區域。我可以使用ginput()函數在Matlab中做到這一點。

我試過使用PIL。但是我發現在發出命令Image.show()之後,會顯示圖像,但程序會暫停,除非我退出圖像窗口。有沒有什麼辦法來實現我的計劃。我是否需要下載其他模塊?請指教。

+0

你沒有說你想要做什麼與感興趣的地區。你只是想將它保存爲磁盤作爲圖像?或者你想要進一步處理區域的座標? – 2009-03-02 11:35:14

回答

6

儘管我同意David的觀點,但您應該使用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]) 

希望這有助於:)

2

Image.show()只是調用任何簡單的圖片查看器,它可以找到目前的平臺,一個可能會或可能不會有作物並節省設備上。

如果你是在Windows中,你只需要使它成爲你的機器上工作,設置了「打開方式」的關聯來使其運行的圖像加載到您選擇的編輯器。在OS X和* nix上,您想要修改Image.py底部的_showxv()方法來更改用於打開圖像的命令。

如果確實需要提供便攜式解決方案,則需要使用UI框架爲裁剪應用程序提供動力。的選擇歸結爲Tkinter(ImageTk.py給你的包裝在Tk的顯示圖像PIL),PyQT4(ImageQt在PIL 1.1.6給您QT4顯示圖像的包裝紙)或wxPython(更高級別的應用程序編寫工具包使用wxWidgets)。完成一個完整的用戶界面工具包會有相當多的工作量,但是您可以完全自定義應用程序界面的工作方式。

+0

+1:你必須寫一些代碼。 – 2009-03-02 11:22:30

4

對於它的價值(從另一個物理學家來),我只想做這個像the GIMP圖像處理程序。使用Python(或任何語言)完成這項任務的主要好處是通過自動化過程來節省時間,但是除非你 - 教授 - 可以以某種方式開發一種算法來自動確定要裁剪哪部分圖像,自動化似乎沒有太多時間來保存。

如果我沒有記錯,GIMP實際上是編寫腳本,可能與Python,所以有可能寫一個節省時間的GIMP腳本來完成你的教授朋友想要什麼。

+1

+1:不要推出自己的。 – 2009-03-02 11:09:18