«Это 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
Далее будем сравнивать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)
Вывод программы показан ниже:
Как показано на рисунке выше, метод локальной пороговой обработки может обеспечить лучшие результаты, когда изображение не является однородным. Следовательно, эти локальные методы пороговой обработки могут быть применены к распознаванию текста.
Наконец, мы узнаем о более интересном алгоритме пороговой обработки —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()
может быть изменен с помощьюthreshold_multiotsu
изclasses
параметр, чтобы изменить количество категорий для наблюдения различных эффектов:
# 将类别数修改为4
thresholds = threshold_multiotsu(image, classes=3)
regions = np.digitize(image, bins=thresholds)
scikit-image
Также предусмотрены другие дополнительные методы пороговой обработки, см.Документация API, чтобы увидеть все доступные методы.
резюме
В этой статье мы расскажем, как использоватьscikit-image
различные алгоритмы пороговой обработки в , в том числе два глобальных метода пороговой обработки (Otsu
и треугольный двоичный алгоритм) и два метода локальной пороговой обработки (Niblack
иSauvola
алгоритм).