[Обработка компьютерного зрения 5] Пороговое значение

задняя часть

Это пятый день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления

Порог

1. Пороговая обработка

Пороговое значение — это процесс установки определенного порога, а затем равномерной обработки пикселей, превышающих пороговое значение, или пикселей, меньших порогового значения. Например, это простое изображение:

在这里插入图片描述

Каждая сетка представляет собой пиксель, а число в сетке представляет значение пикселя изображения. Если порог установлен на 8, то мы можем разделить изображение на две области, как показано ниже:

在这里插入图片描述

Затем мы равномерно работаем с зеленой или синей областью, что является пороговой обработкой.

Наша обычная операция состоит в том, чтобы рассматривать значения пикселей выше определенного порога как 255 или значения пикселей ниже определенного порога как 0. Или оба одновременно. Когда мы делаем и то, и другое одновременно, мы можем превратить эту операцию в бинаризацию, потому что обработанное изображение имеет только два цвета, чистый черный и чистый белый.

2. Пороговая обработка с помощью numpy

существуетnumpyизndarrayМассивы обеспечивают операции с логическими индексами. С булевым индексированием мы можем легко и быстро реализовать пороговую обработку без написания большого количества циклов for.

Операция логического индексирования основана на логических матрицах, поэтому нам нужно знать о логических матрицах.

(1) Булева матрица

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

Мы генерируем логическую матрицу, используя следующий код:

import numpy as np
m = np.array([False, True, False, False], dtype=np.bool_)
print(m)

Результат выглядит следующим образом:

[False  True False False]

Но эта матрица, кажется, не имеет никакого эффекта. Приведенный выше код написан только для того, чтобы вы знали, что логическая матрица является булевой.ndarrayмножество.

Помимо ручного создания логических матриц самостоятельно, мы также можем генерировать логические матрицы массива с помощью операторов сравнения. как:

import numpy as np
# 生成一个二维矩阵
x = np.array([
    [10, 13, 90],
    [80, 21, 34],
    [1, 4, 6]], dtype=np.uint8
)
# 通过比较生成布尔矩阵
bool_x = x > 8
print(bool_x)

В коде мы создаем 2D-матрицу. затем пройтиx > 8для создания булевой матрицы вывод:

[[ True  True  True]
 [ True  True  True]
 [False False False]]

можно увидетьbool_xиxФорма такая же, и существует взаимно однозначное соответствие между элементами булевой матрицы и двумерной матрицы. Когда значение элемента больше 8, оно представляется в булевой матрице какTrueВ противном случае он ведет себя какFalse. Схема выглядит следующим образом:

在这里插入图片描述

(2) Булев индекс

С булевой матрицей мы можем выполнять логическое индексирование. Булева индексация будет выполняться только для матриц, т.к.Trueчасть операции. Например следующий код:

import numpy as np
x = np.array([
    [10, 13, 90],
    [80, 21, 34],
    [1, 4, 6]], dtype=np.uint8
)
bool_x = x > 8
# 将元素值大于8的元素赋值为255
x[bool_x] = 255
print(x)

Результат выглядит следующим образом:

[[255 255 255]
 [255 255 255]
 [  1   4   6]]

Здесь должно быть ясно, что мы работаем с реальной матрицей. Логические матрицы — это всего лишь рекомендации, сообщающие программе, какими элементами нам нужно манипулировать.

Как видно из результатов, элементам больше 8 присваивается 255, а остальные элементы остаются без изменений.

3. Opencv реализует пороговую обработку

(1) Функция пороговой обработки

существуетopencvФункция пороговой обработки представлена ​​в , и ее функция определяется как:

thresh, dst = cv2.threshold(src, thresh, maxval, type)

Смысл параметров следующий:

在这里插入图片描述

Два возвращаемых значения — пороговое значение и результирующее изображение после обработки.

Ниже приведены несколько необязательных параметров порогового типа обработки:

在这里插入图片描述

Когда наш пороговый тип обработки — двоичная обработка,maxvalработают только параметры.

(3) Различия в пороговой обработке

Поговорим о разнице между различными пороговыми обработками. Конкретная таблица выглядит следующим образом:

在这里插入图片描述

Давайте попробуем это с кодом:

import cv2
# 读取图片
img = cv2.imread('beautiful.JPG', 0)
# 进行二值化阈值处理
_, result = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 显示图片
cv2.imshow('result', result)
cv2.waitKey()
cv2.destroyAllWindows()

Ниже приведено сравнение между рендерингом и исходным изображением:

在这里插入图片描述

Как видите, исходное изображение темнее. И наш порог установлен на 127, что приводит к более плохому эффекту бинарного изображения.Мы упомянем решение позже.

Давайте снова попробуем усеченный порог:

import cv2
img = cv2.imread('beautiful.JPG')
_, result = cv2.threshold(img, 100, 255, cv2.THRESH_TRUNC)
cv2.imshow('result', result)
cv2.waitKey()
cv2.destroyAllWindows()

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

在这里插入图片描述

Поскольку некоторые точки с высокими значениями пикселей подавляются, изображение с эффектом становится темнее, а контраст значительно снижается.

Остальное вы можете попробовать сами.

4. Обработка Оцу

В приведенных выше примерах нам всем нужно установить порог вручную. Более того, эффект разных пороговых значений для разных изображений будет очень разным, иOtsuАлгоритм — это алгоритм, который автоматически определяет порог. мы можем использоватьcv2.thresholdФункция реализована напрямую, используя следующее:

import cv2
import numpy as np
img = cv2.imread('beautiful.JPG', 0)
_, result1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 使用Otsu算法
thresh, result2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 将两张图片横向拼接
result = np.hstack((result1, result2))
# 输出Ostu算法得到的阈值
print(thresh)
cv2.imshow('result', result)
cv2.waitKey()
cv2.destroyAllWindows()

Мы использовали обычную бинаризацию иOtsuАлгоритм, следующая диаграмма эффекта:

在这里插入图片描述

На этот раз фон выглядит намного четче.

Выходные пороги следующие:

99.0

Можно попробовать обработать несколько разных изображений.

Для получения дополнительной информации вы можете следить за моей официальной учетной записью «Новая папка X».