【问题标题】:Digital Image cropping in PythonPython中的数字图像裁剪
【发布时间】:2010-10-10 18:06:05
【问题描述】:

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

我是 Python 编程的初学者。我不是计算机专业人士,我是物理学家。我正在尝试用 python 编写代码,用于我自己的研究,其中涉及一点图像处理。

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

我尝试使用 PIL。但是我发现在我发出命令 Image.show() 之后,图像会显示出来,但是程序会在那里停止,除非我退出图像窗口。有什么办法可以实现我的计划。我需要下载任何其他模块吗?请指教。

【问题讨论】:

  • 你没有说你想对感兴趣的区域做什么。您只想将其作为图像保存到磁盘吗?还是您想要该区域的坐标进行进一步处理?

标签: python image-processing


【解决方案1】:

虽然我同意 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】:

    对于它的价值(来自另一位物理学家),我会在像 the GIMP 这样的图像处理程序中执行此操作。用 Python(或任何语言)完成这项任务的主要好处是通过自动化过程来节省时间,但除非你——好吧,教授——可以以某种方式开发一种算法来自动找出要裁剪的图像的哪一部分,自动化似乎无法节省太多时间。

    如果我没记错的话,GIMP 实际上是可编写脚本的,可能使用 Python,因此可以编写一个节省时间的 GIMP 脚本来执行您的教授朋友想要的操作。

    【讨论】:

      【解决方案3】:

      Image.show() 只是调用它可以在当前平台上找到的任何简单的图片查看器,可能有也可能没有裁剪和保存工具。

      如果您使用的是 Windows 机器,并且只需要让它在您的机器上运行,请设置“打开方式...”关联以使其运行图像将其加载到您选择的编辑器中。在 OS X 和 *nix 上,您需要破解 Image.py 底部的 _showxv() 方法来更改用于打开图像的命令。

      如果您确实需要提供可移植的解决方案,则需要使用 UI 框架来支持您的裁剪应用程序。选择归结为Tkinter(ImageTk.py 为您提供了一个用于在 Tk 中显示 PIL 图像的包装器)、PyQT4(PIL 1.1.6 中的 ImageQt 为您提供了一个用于在 QT4 中显示图像的包装器)或wxPython(一个使用 wxWidgets 的更高级别的应用程序创作工具包)。掌握完整的 UI 工具包需要大量工作,但您将能够完全自定义应用程序界面的工作方式。

      【讨论】:

        【解决方案4】:

        python 中是否有类似库的脚本来自动裁剪图像: Automatically crop image

        【讨论】:

          【解决方案5】:

          您正在寻找的是模块:matplotlib,它模拟 Matlab。请参阅 ginput() 函数。这允许您找到边界框,然后您可以使用 PIL 中的裁剪。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-09-06
            • 2023-03-05
            • 2017-05-22
            • 2015-05-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多