繁体   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