Пороговый алгоритм сегментации изображения в scikit-image

искусственный интеллект компьютерное зрение
Пороговый алгоритм сегментации изображения в scikit-image

«Это 20-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."

Внедрение и установка scikit-image

Поскольку пороговое значение изображения является важным шагом во многих приложениях компьютерного зрения, методы порогового значения включены во многие библиотеки алгоритмов, в том числеscikit-image.scikit-imageЭто пакет алгоритмов для обработки изображений, его подробное описание можно найти вОфициальный сайт,Зависит отscikit-imageОбработанное изображение необходимо сначала преобразовать вNumPyмножество. В этой статье мы будем использоватьscikit-imageВнедрите методы пороговой обработки. Если не установленscikit-imageбиблиотеку, вам сначала нужно установить ее с помощью следующей командыscikit-image:

pip install scikit-image

Пороговое значение с помощью scikit-image

чтобыscikit-imageИспользуя пороговый алгоритм в , возьмемOtsuАлгоритм бинаризации для пороговой обработки тестового изображения представлен в качестве примера. Первым шагом является импорт необходимых пакетов:

from skimage.filters import threshold_otsu
from skimage import img_as_ubyte

затем используйтеscikit-imageприменениеOtsuАлгоритм бинаризации для:

# 加载图像
image = cv2.imread('example.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256])
# 基于 otsu 方法的返回阈值
thresh = threshold_otsu(gray_image)
# 生成布尔数组:
binary = gray_image > thresh
# 转换为uint8数据类型
binary = img_as_ubyte(binary)

threshold_otsu(gray_image)функционировать в соответствии сOtsuАлгоритм бинаризации возвращает пороговое значение. После этого используйте это значение для построения бинарного образа (dtype= bool), который, наконец, должен быть преобразован в формат 8-битного целого числа без знака (dtype=uint8) для визуализации используйтеimg_as_ubyte()Функция завершает процесс преобразования. Вывод программы показан ниже:

使用 scikit-image 进行阈值处理

Далее мы расскажем, как использоватьscikit-imageНекоторые другие методы пороговой обработки в .

Другие методы пороговой обработки в scikit-image

Далее будем сравниватьOtsu,triangle,NiblackиSauvolaМетоды пороговой обработки выполняют различные эффекты пороговой обработки.Otsuиtriangleметод глобального порога, иNiblackиSauvolaявляется локальным пороговым методом. Когда фон не является однородным, метод локальной пороговой обработки является лучшим методом для пороговой обработки.

Опять же, первым шагом будет импорт необходимых пакетов:

from skimage.filters import threshold_otsu, threshold_triangle, threshold_niblack, threshold_sauvola
from skimage import img_as_ubyte
import cv2
import matplotlib.pyplot as plt

Вызов каждого порогового метода (threshold_otsu(),threshold_niblack(),threshold_sauvola()иthreshold_triangle()), использоватьscikit-imageКонтрастное выполнение пороговой операции:

# Otsu
thresh_otsu = threshold_otsu(gray_image)
binary_otsu = gray_image > thresh_otsu
binary_otsu = img_as_ubyte(binary_otsu)
# Niblack
thresh_niblack = threshold_niblack(gray_image, window_size=25, k=0.8)
binary_niblack = gray_image > thresh_niblack
binary_niblack = img_as_ubyte(binary_niblack)
# Sauvola
thresh_sauvola = threshold_sauvola(gray_image, window_size=25)
binary_sauvola = gray_image > thresh_sauvola
binary_sauvola = img_as_ubyte(binary_sauvola)
# triangle
thresh_triangle = threshold_triangle(gray_image)
binary_triangle = gray_image > thresh_triangle
binary_triangle = img_as_ubyte(binary_triangle)

Вывод программы показан ниже:

使用 scikit-image 进行阈值处理

Как показано на рисунке выше, метод локальной пороговой обработки может обеспечить лучшие результаты, когда изображение не является однородным. Следовательно, эти локальные методы пороговой обработки могут быть применены к распознаванию текста. Наконец, мы узнаем о более интересном алгоритме пороговой обработки —Multi-OtsuМетод пороговой обработки, который можно использовать для разделения пикселей входного изображения на ряд различных категорий, каждая категория рассчитывается на основе интенсивности оттенков серого в изображении.Multi-OtsuВычислить несколько порогов на основе количества требуемых классов, количество классов по умолчанию равно 3, в этот момент будет получено три класса, алгоритм возвращает два порога, представленные красной линией на гистограмме.

import matplotlib
import numpy as np
import cv2
from skimage import data
from skimage.filters import threshold_multiotsu

image = cv2.imread('8.png')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用默认值调用 threshold_multiotsu()
thresholds = threshold_multiotsu(image)
regions = np.digitize(image, bins=thresholds)

def show_img_with_matplotlib(img, title, pos, cmap):
    ax = plt.subplot(1, 3, pos)
    plt.imshow(img, cmap=cmap)
    plt.title(title, fontsize=8)
    plt.axis('off')

fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(10, 3.5))

# 绘制灰度图像
show_img_with_matplotlib(image, 'Original', 1, cmap='gray')

# 可视化直方图
ax[1].hist(image.ravel(), bins=255)
ax[1].set_title('Histogram')
for thresh in thresholds:
    ax[1].axvline(thresh, color='r')

# 可视化 Multi Otsu 结果
show_img_with_matplotlib(regions, 'Multi-Otsu result', 3, cmap='jet')
plt.subplots_adjust()

plt.show()

Multi-Otsu

может быть изменен с помощьюthreshold_multiotsuизclassesпараметр, чтобы изменить количество категорий для наблюдения различных эффектов:

# 将类别数修改为4
thresholds = threshold_multiotsu(image, classes=3)
regions = np.digitize(image, bins=thresholds)

Multi-Otsu

scikit-imageТакже предусмотрены другие дополнительные методы пороговой обработки, см.Документация API, чтобы увидеть все доступные методы.

резюме

В этой статье мы расскажем, как использоватьscikit-imageразличные алгоритмы пороговой обработки в , в том числе два глобальных метода пороговой обработки (Otsuи треугольный двоичный алгоритм) и два метода локальной пороговой обработки (NiblackиSauvolaалгоритм).