В образце, который вы разместили, можно приблизить средний цвет текста по заданным гистограммам.
В общем случае вам необходимо отделить текст от фона и собрать только гистограмму текстовых пикселей.
На изображении, которое вы разместили, мы можем предположить, что фон белый (цвет RGB около [255, 255, 255]), а текст темный (все значения цвета компонентов RGB - это текстовые значения низкий).
Вы можете использовать следующие этапы:
- Собирать гистограммы каналов красного, зеленого и синего цветов.
- Удалять все высокие значения из гистограмм (установите значение гистограммы на ноль).
Предположим, что высокие значения получены из фоновых пикселей. - Вычислить сумму гистограмм.
Сумма представляет количество пикселей в исходном изображении. - Вычислить сумма пикселей в исходном изображении в соответствии с гистограммой.
Пример: если h[100] = 10
, то в изображении 10 пикселей со значением 100.
Сумма из 10 пикселей равна 100 * 10.
Сумма пикселей в исходном изображении: h[0]*0 + h[1]*1 + h[2]*2...
- Вычислить среднее значение - разделить сумму на количество.
Вот код:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('img.png') # Read input image
h_red = cv2.calcHist([img], [2], None, [256], [0,256])
h_green = cv2.calcHist([img], [1], None, [256], [0,256])
h_blue = cv2.calcHist([img], [0], None, [256], [0,256])
#h_red.sum() must be img.shape[0]*img.shape[1]
# Remove background pixels from the histograms.
# Set histogram bins above 230 with zero
# assume all text has lower values of red, green and blue.
h_red[230:] = 0
h_green[230:] = 0
h_blue[230:] = 0
# Compute number of elements in histogram, after removing background
count_red = h_red.sum()
count_green = h_green.sum()
count_blue = h_blue.sum()
# Compute the sum of pixels in the original image according to histogram.
# Example:
# If h[100] = 10
# Then there are 10 pixels with value 100 in the image.
# The sum of the 10 pixels is 100*10.
# The sum of an pixels in the original image is: h[0]*0 + h[1]*1 + h[2]*2...
sum_red = np.sum(h_red * np.c_[0:256])
sum_green = np.sum(h_green * np.c_[0:256])
sum_blue = np.sum(h_blue * np.c_[0:256])
# Compute the average - divide sum by count.
avg_red = sum_red / count_red
avg_green = sum_green / count_green
avg_blue = sum_blue / count_blue
print('Text RGB average is about: {}, {}, {}'.format(avg_red, avg_green, avg_blue))
Примечание:
Я намеренно сохранил код простым, без циклов for.
Я думаю, вам лучше изменить код и использовать для циклов.