3

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

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”在我想和工作矩形鼠标点击,我该怎么办呢?

谢谢

回答

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 

的回调将自己从窗口工具的不同而不同窗口的工具,但概念是相同的:捕捉点击关闭事件和释放事件和比较点触发事件以创建您的矩形。诀窍是记住找出它们从哪个角落开始(第二个点总是在该角落的对面),并创建相对于原始图像本身裁剪的矩形。

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

6

你可以使用matplotlib.widgets.RectangleSelector(感谢乔金顿对这个建议)来处理按钮按下事件:

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() 
+0

在一个侧面说明,甚至还有一个matplotlib部件拿到按钮按下和释放事件与少一点样板和为你画一个不错的盒子:'matplotlib.widgets.RectangleSelector' http://matplotlib.sourceforge.net/api/widgets_api.html?highlight=matplotlib.widgets#matplotlib.widgets.RectangleSelector –

+0

@Joe Kington:谢谢,乔。这绝对是一个改进! – unutbu

相关问题