【问题标题】:How to crop a region selected with mouse click, using Python?如何使用 Python 裁剪通过鼠标单击选择的区域?
【发布时间】:2011-10-18 11:11:23
【问题描述】:

我正在使用 Matplotlib 和 PIL 使用 python,并且需要查看图像选择并剪切我必须使用的区域,只留下所选区域的图像。我已经知道如何使用剪切图像pil(使用im.crop)但我如何选择坐标以通过鼠标单击来裁剪图像? 为了更好地解释,我像这样裁剪图像:

import Pil 
import Image
im = Image.open("test.jpg")

crop_rectangle = (50, 50, 200, 200)
cropped_im = im.crop(crop_rectangle)

cropped_im.show()

我需要在我想使用的矩形中单击鼠标来给出坐标“crop_rectangle”,我该怎么做?

谢谢

【问题讨论】:

    标签: python image-processing matplotlib python-imaging-library


    【解决方案1】:

    您可以使用matplotlib.widgets.RectangleSelector(感谢 Joe Kington 的建议)来处理按钮按下事件:

    import numpy as np
    import matplotlib.pyplot as plt
    import Image
    import matplotlib.widgets as widgets
    
    def onselect(eclick, erelease):
        if eclick.ydata>erelease.ydata:
            eclick.ydata,erelease.ydata=erelease.ydata,eclick.ydata
        if eclick.xdata>erelease.xdata:
            eclick.xdata,erelease.xdata=erelease.xdata,eclick.xdata
        ax.set_ylim(erelease.ydata,eclick.ydata)
        ax.set_xlim(eclick.xdata,erelease.xdata)
        fig.canvas.draw()
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    filename="test.png"
    im = Image.open(filename)
    arr = np.asarray(im)
    plt_image=plt.imshow(arr)
    rs=widgets.RectangleSelector(
        ax, onselect, drawtype='box',
        rectprops = dict(facecolor='red', edgecolor = 'black', alpha=0.5, fill=True))
    plt.show()
    

    【讨论】:

    • 附带说明一下,甚至还有一个 matplotlib 小部件可以使用更少的样板来获取按钮按下和释放事件,并为您绘制一个漂亮的框:matplotlib.widgets.RectangleSelectormatplotlib.sourceforge.net/api/…
    • @Joe Kington:谢谢你,乔。这绝对是一个进步!
    【解决方案2】:

    你在用 tk 吗?这取决于您使用的窗口管理。不过,高级别的,你会想要这样的:

    def onMouseDown():
        // get and save your coordinates
    
    def onMouseUp():
        // save these coordinates as well
    
        // now compare your coordinates to fingure out which corners
        // are being used and define your rectangle
    

    回调本身会因窗口工具而异,但概念是相同的:捕获点击事件和释放事件并比较触发事件的点以创建矩形。诀窍是记住要弄清楚它们从哪个角开始(第二个点总是与那个角相对)并创建要裁剪的矩形,相对于原始图像本身。

    同样,根据工具的不同,您可能需要将点击事件放在图像的坐标空间中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      相关资源
      最近更新 更多