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

Рассмотрим изображение ниже, это изображение имеет неправильные условия освещения, что затрудняет обнаружение объектов на изображении. Таким образом, вы можете применить простую технику, известную как выравнивание гистограммы, чтобы улучшить результаты вашего обнаружения или улучшить освещение на этом изображении.

Давайте посмотрим, как мы можем сделать это в Python! Давайте начнем с импорта этих пакетов. Если у вас не установлен какой-либо пакет в приведенном ниже блоке кода
, просто перейдите в терминал и введите pip install package-name.

import cv2
import argparse
import numpy as np
import matplotlib.pyplot as plt

К счастью, OpenCV предоставляет нам метод выравнивания гистограммы по умолчанию, все, что вам нужно сделать, это:

  1. Загрузите изображение
  2. Скройте его в оттенках серого
  3. Применить cv2.equalizeHist(gray_scale_image)

Давайте посмотрим на это в действии!

ap = argparse.ArgumentParser()
ap.add_argument('-i', '--image', required=True, help='image to be prcoessed')
args = vars(ap.parse_args())
image = cv2.imread(args['image'])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
equalized_image = cv2.equalizeHist(gray)
cv2.imshow("original gray", gray)
cv2.imshow("Equalized image", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

И результат таков:

Теперь, как вы можете видеть, хотя мы можем видеть объекты на заднем плане, такие как объект в виде буквы «А» справа, или стулья, которые вы можете ясно видеть сейчас, или объекты на вершине камина, но некоторый шум был тоже усилил! Теперь это связано с тем, что освещение изображения было выровнено по всему изображению сразу, и это чрезмерно усилило шум изображения, поэтому для решения этой проблемы мы можем использовать адаптивное выравнивание гистограммы, которое применяет выравнивание гистограммы по частям, или вы можете сказать, окно по окно.

Теперь это называется CLAHE (Контрастное ограниченное адаптивное выравнивание гистограммы).

Теперь, как это работает:

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

Однако применение только AHE на самом деле чрезмерно усиливает шум в относительно однородных областях изображения.

Теперь обычное выравнивание гистограммы использует одну функцию преобразования по всему изображению, но адаптивное выравнивание гистограммы фактически использует разные типы функции преобразования в каждой локальной окрестности изображения.
Эта функция преобразования пропорциональна кумулятивной функции распределения (CDF) значений пикселей в окрестности.
Теперь, применяя только AHE, можно фактически чрезмерно усиливать шум в относительно однородных областях. , поэтому для решения этого CLAHE возникает картина:
В CLAHE контрастное усиление вблизи заданного значения пикселя определяется наклоном функции преобразования.
Теперь эта функция преобразования прямо пропорциональна наклон кумулятивной функции распределения окрестности (CDF). CLAHE ограничивает усиление шума, обрезая гистограмму до заданного значения перед вычислением CDF. Это ограничивает наклон CDF и, следовательно, функции преобразования, что, в свою очередь, ограничивает чрезмерное усиление шума.

Обычно этот предел клипа составляет от 3 до 5.

Давайте посмотрим, что в действии!

ap = argparse.ArgumentParser()
ap.add_argument('-i', '--image', required=True, help='image to be processed')
ap.add_argument('-c', '--clip', default=2.0, help='clip size for CLAHE')
ap.add_argument('-t', '--tile', default=8, help='tile size for CLAHE')
args = vars(ap.parse_args())

Здесь clip — это предел клипа, как мы обсуждали выше, а tile — размер окрестности, размер 8 означает, что мы собираемся разделить это изображение на окрестности (8x8).

image = cv2.imread(args['image'])

(b, g, r) = cv2.split(image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(
    clipLimit=args['clip'], tileGridSize=(args['tile'], args['tile']))
equalized_imageb = clahe.apply(b)
equalized_imageg = clahe.apply(g)
equalized_imager = clahe.apply(r)
merged = cv2.merge([equalized_imageb, equalized_imageg, equalized_imager])
cv2.imshow(‘Original Image’, image)
cv2.imshow(‘Equalized Image’, merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

Теперь давайте посмотрим на результаты,

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

Полный код вы можете найти здесь.

Увидимся в следующий раз, где мы обсудим сопоставление гистограмм и определение цвета.

Использованная литература:

PyimageSearch.com
Википедия