Пороговая обработка изображения с использованием RangeSlider

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии будет показано, как использовать виджет RangeSlider в Matplotlib для управления пороговым значением изображения. Цель пороговой обработки - преобразовать серое изображение в бинарное, где пиксели могут быть либо черными, либо белыми. Это полезно для сегментации изображений, когда мы хотим извлечь определенные признаки из изображения.

Советы по использованию ВМ

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

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

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

Сгенерировать фейковое изображение

Сначала мы сгенерируем фейковое серое изображение с использованием модуля random в NumPy. Мы установим сид, чтобы результаты были воспроизводимыми.

np.random.seed(19680801)
N = 128
img = np.random.randn(N, N)

Отобразить изображение и его гистограмму

Далее мы отобразим изображение с использованием функции imshow из Matplotlib, а также его гистограмму с использованием hist. Мы создадим фигуру с двумя подграфиками, один для изображения, а другой для гистограммы.

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
fig.subplots_adjust(bottom=0.25)

im = axs[0].imshow(img)
axs[1].hist(img.flatten(), bins='auto')
axs[1].set_title('Histogram of pixel intensities')

Создать RangeSlider

Теперь мы создадим виджет RangeSlider, который позволит нам настраивать порог изображения. Мы создадим новую ось для ползунка и добавим ее в фигуру.

slider_ax = fig.add_axes([0.20, 0.1, 0.60, 0.03])
slider = RangeSlider(slider_ax, "Threshold", img.min(), img.max())

Добавить вертикальные линии на гистограмму

Для того, чтобы было проще увидеть эффект пороговой обработки, мы добавим вертикальные линии на гистограмму, чтобы показать текущие значения порога. Мы создадим две линии для нижних и верхних значений порога соответственно.

lower_limit_line = axs[1].axvline(slider.val[0], color='k')
upper_limit_line = axs[1].axvline(slider.val[1], color='k')

Создать функцию обратного вызова для ползунка

Мы создадим функцию обратного вызова, которая будет вызываться каждый раз, когда пользователь изменяет значения порога с использованием ползунка. Функция обновит карту цветов изображения и позиции вертикальных линий на гистограмме.

def update(val):
    ## The val passed to a callback by the RangeSlider will
    ## be a tuple of (min, max)

    ## Update the image's colormap
    im.norm.vmin = val[0]
    im.norm.vmax = val[1]

    ## Update the position of the vertical lines
    lower_limit_line.set_xdata([val[0], val[0]])
    upper_limit_line.set_xdata([val[1], val[1]])

    ## Redraw the figure to ensure it updates
    fig.canvas.draw_idle()


slider.on_changed(update)

Отобразить фигуру

Наконец, мы отобразим фигуру с изображением и ползунком.

plt.show()

Резюме

В этом практическом занятии мы показали, как использовать виджет RangeSlider в Matplotlib для управления пороговой обработкой изображения. Мы показали, как создать фальшивое оттеночное изображение, отобразить его и гистограмму, создать ползунок для настройки значений порога и обновить изображение и гистограмму в зависимости от значений ползунка. Эта техника может быть использована для сегментации изображений и других приложений, где необходимо извлечь определенные признаки из изображения.