Как добавить визуальные аннотации к изображению с помощью python в блокноте jupyter?

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

Просмотр/загрузка/хранение метаданных в основном завершены, но мне еще предстоит найти какие-либо пакеты, которые позволяют мне рисовать изображения в блокнотах Jupyter. Это может либо манипулировать пикселями, либо по существу создавать новое изображение поверх отображаемого изображения.

В настоящее время я показываю данные изображения с помощью matplotlib.

Я видел некоторое использование javascript для отслеживания движения мыши и нажатий клавиш, но не могу понять, как использовать это в своих интересах. Я могу использовать любой пакет, если он работает в jupyter.


person sutartmelson    schedule 06.06.2016    source источник
comment
Я не думаю, что Jupyter - правильный инструмент для работы, кажется, вы хотите разработать веб-приложение.   -  person Edu    schedule 07.06.2016
comment
@Edu Хотя я согласен с вами, к сожалению, это мое текущее ограничение в работе: /   -  person sutartmelson    schedule 07.06.2016
comment
Чтобы уточнить ваш вопрос, вы говорите, что хотели бы иметь возможность сначала отображать необработанное изображение, а затем отслеживая движение мыши и щелчки рисовать круги и стрелки на этом изображении - и делать все это в пределах контекст блокнота Jupyter?   -  person michael_j_ward    schedule 07.06.2016
comment
@michael_j_ward, верно. Очевидно, что отображать изображение достаточно просто. Отслеживание движения мыши и щелчков возможно в контексте. Просто не уверен, как применить это к рисованию, если это возможно.   -  person sutartmelson    schedule 07.06.2016
comment
@sutartmelson, понял. Возможно, это может быть полезно: matplotlib.org/examples/pylab_examples/cursor_demo.html это обсуждение stackoverflow: stackoverflow.com/questions/9136938/ Я никогда не делал ничего подобного сам. Если вы найдете решение, пожалуйста, поделитесь им.   -  person michael_j_ward    schedule 07.06.2016


Ответы (2)


Благодаря предложениям @michael_j_ward я нашел решение. Я просмотрел эти обсуждения и учебные пособия, а также прочитал документацию по осям matplotlib. Вот что я придумал/переделал

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import numpy as np
import dicom


class Annotator(object):
    def __init__(self, axes):
        self.axes = axes

        self.xdata = []
        self.ydata = []

    def mouse_move(self, event):
        if not event.inaxes:
            return

        x, y = event.xdata, event.ydata

        self.xdata.append(x)
        self.ydata.append(y)
        line = Line2D(self.xdata,self.ydata)
        line.set_color('r')
        self.axes.add_line(line)

        plt.draw()

    def mouse_release(self, event):
        # Erase x and y data for new line
        self.xdata = []
        self.ydata = []

path = '../sample.dcm'

data = dicom.read_file(path)

img = data.pixel_array

fig, axes = plt.subplots()
axes.imshow(img[0])
plt.axis("off")
plt.gray()
annotator = Annotator(axes)
plt.connect('motion_notify_event', cursor.mouse_move)
plt.connect('button_release_event', cursor.mouse_release)

axes.plot()

plt.show()

скриншот

Это позволяет мне открывать изображения и рисовать на них, чтобы выделить или аннотировать важные части изображения.

person sutartmelson    schedule 07.06.2016
comment
Откуда cursor? Я получаю NameError: имя «курсор» не определено - person MrMartin; 06.05.2019

Внутри блокнота Jupyter вы можете использовать:

%matplotlib inline
person Kevin K.    schedule 06.06.2016