Python中的数字图像裁剪

2024-04-28 04:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

从一个教授,一个物理学家那里得到这个问题。

我是Python编程的初学者。我不是电脑专家,我是物理学家。我试图用python编写一个代码,用于我自己的研究,其中涉及到一些图像处理。

我需要做的就是显示一个图像,然后用鼠标选择一个感兴趣的区域,最后裁剪出选定的区域。我可以在Matlab中使用ginput()函数来实现这一点。

我试过用PIL。但是我发现,在我发出命令Image.show()之后,图像会显示出来,但是除非我从图像窗口退出,否则程序将停止运行。有没有办法实现我的计划。我需要下载其他模块吗?请告知。


Tags: 代码图像区域编程鼠标图像处理感兴趣专家
3条回答

就其价值而言(来自另一个物理学家),我只需要在图像处理程序中,比如the GIMP来做这个。用Python(或任何语言)完成这项任务的主要好处是通过自动化过程来节省时间,但是除非你——嗯,教授——能够以某种方式开发一种算法来自动找出要裁剪的图像的哪个部分,否则自动化似乎不会节省太多时间。

如果我没记错的话,GIMP实际上是可以编写脚本的,可能是用Python编写的,所以可以编写一个节省时间的GIMP脚本来完成您的教授朋友想要的工作。

show()只调用它在当前平台上可以找到的任何简单图片查看器,一个可能有或没有裁剪和保存功能的查看器。

如果您在Windows box上,只需要让它在您的计算机上工作,请设置“打开方式…”关联,使其运行图像时将其加载到您选择的编辑器中。在OSX和*nix上,您可能想破解Image.py底部的_showxv()方法,以更改用于打开映像的命令。

如果您确实需要提供可移植的解决方案,则需要使用UI框架来增强裁剪应用程序的功能。这些选择可以归结为Tkinter(ImageTk.py为在Tk中显示PIL图像提供包装)、PyQT4(PIL 1.1.6中的ImageQt为在QT4中显示图像提供包装)或wxPython(使用wxWidgets的高级应用程序创作工具包)。获得一个完整的UI工具包需要做很多工作,但是您将能够完全定制应用程序的界面的工作方式。

虽然我同意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])

希望这有帮助:)

相关问题 更多 >