2009-03-02 83 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