Как обрезать область, выделенную щелчком мыши, используя Python? - PullRequest
3 голосов
/ 02 августа 2011

Я работаю с python, используя Matplotlib и PIL, и мне нужно посмотреть на изображение, выбрать и обрезать область, с которой мне нужно работать, оставив только изображение выбранной области. Я уже знаю, как вырезать изображения с помощью 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 ]

6 голосов
/ 02 августа 2011

Вы можете использовать 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 голосов
/ 02 августа 2011

ты используешь тк?это будет зависеть от того, какое оконное управление вы используете.Однако на высоком уровне вам понадобится что-то вроде:

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

Сами обратные вызовы будут отличаться от инструмента окна к инструменту окна, но концепция будет одинаковой: захват события нажатия кнопки вниз и отпускания события и сравнениеточки, где события были вызваны, чтобы создать свой прямоугольник.Хитрость заключается в том, чтобы не забыть выяснить, с какого угла они начинаются (вторая точка всегда противоположна этому углу) и создать прямоугольник, который нужно обрезать, относительно самого исходного изображения.

Опять же, в зависимости от инструмента, вам, вероятно, потребуется поместить события щелчка в координатное пространство вашего изображения.

...