[Stove AI] Машинное обучение 047 - Операция выравнивания гистограммы изображения

машинное обучение искусственный интеллект Python scikit-learn

[Stove AI] Машинное обучение 047 - Операция выравнивания гистограммы изображения

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)

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

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


1. Получите гистограмму изображения

Гистограмма изображения имеет различие между гистограммой в градациях серого и гистограммой цвета.Если входное изображение представляет собой изображение в градациях серого, получается гистограмма в градациях серого, а если входное изображение является изображением BGR, получается гистограмма цветового канала.

# 获取灰度直方图
gray_hist=cv2.calcHist([gray], [0], None, [256], [0, 256])
plt.plot(gray_hist)

Чтобы получить гистограмму изображения в градациях серого, просто вызовите функцию cv2.calcHist() Параметры этой функции:

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

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

Третий параметр — Mask, который здесь не используется, поэтому используйте None.

Четвертый параметр — это histSize, который указывает, на сколько частей разделена гистограмма (т. е. на сколько столбцов).

Пятый параметр — это значение, представляющее каждый пиксель в гистограмме, [0,0, 256,0] указывает, что гистограмма может представлять пиксели со значениями пикселей от 0,0 до 256.

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

Последнее накопление — это логическое значение, указывающее, сложены ли гистограммы.

# 获取彩色图的各个通道直方图
hist_B=cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color

hist_G=cv2.calcHist([img],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G')  # green color

hist_R=cv2.calcHist([img],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('histogram of Color Chanel')
plt.legend()


2. Выравнивание гистограммы

2.1 Выравнивание гистограммы изображений в градациях серого

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

# 灰度图的直方图均衡化:
# 先显示均衡化前后的图像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
plt.imshow(gray,cmap='gray')
plt.title('GrayImg before Equalization')

equalize = cv2.equalizeHist(gray)
plt.subplot(122)
plt.imshow(equalize,cmap='gray')
plt.title('GrayImg after Equalization')

plt.plot(gray_hist,c='b',label='raw_Hist')

gray_equalized_hist=cv2.calcHist([equalize], [0], None, [256], [0, 256])
plt.plot(gray_equalized_hist,c='r',label='Equalized')

plt.legend()
plt.title('Histogram comparison')

Другими словами, почему гистограмма после выравнивания гистограммы такая безобразная?

Для эквализации гистограммы требуется только одна функция cv2.equalizeHist(), но следует отметить: cv2.equalizeHist() обеспечивает обработку только изображений с оттенками серого.Когда приведенное выше изображение заменяется изображением RGB, будет сообщено об ошибке.

2.2 Выравнивание гистограммы цветных изображений

Выравнивание гистограммы цветных изображений требует помощи пространства YUV, следующий код:

# 彩色直方图均衡化需要借助YUV空间
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
img_histeq = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)

# 显示均衡化前后的图像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.title('ColorImg before Equalization')

plt.subplot(122)
img_hist_rgb=cv2.cvtColor(img_histeq,cv2.COLOR_BGR2RGB)
plt.imshow(img_hist_rgb)
plt.title('ColorImg after Equalization')

# 显示均衡化前后的直方图情况
plt.figure(12)

plt.subplot(121)
hist_B=cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color

hist_G=cv2.calcHist([img],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G')  # green color

hist_R=cv2.calcHist([img],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('Color Histogram before Equalization')
plt.legend()

plt.subplot(122)
hist_B=cv2.calcHist([img_histeq],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color

hist_G=cv2.calcHist([img_histeq],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G')  # green color

hist_R=cv2.calcHist([img_histeq],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('Color Histogram after Equalization')
plt.legend()

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

########################резюме########################## ######

1. Очевидно, что работа с гистограммой изображения может изменить контрастность и яркость изображения.

2. Использование функции cv2.equalizeHist может напрямую изменить гистограмму изображения в градациях серого, но не может напрямую изменить гистограмму цветного изображения.Если вы хотите выровнять цветное изображение, вам необходимо сначала преобразовать его в пространство YUV и затем преобразовать его.

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

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

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.