如何使用Python鼠标单击选择的区域?

时间:2011-08-02 17:31:10

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

我正在使用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”,我该怎么办?

谢谢

2 个答案:

答案 0 :(得分:6)

您可以使用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()

答案 1 :(得分:0)

你正在使用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

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

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