Можно ли определить цвет и положение текста с помощью гистограммы opencv в python? - PullRequest
2 голосов
/ 03 апреля 2020

Мне нужно определить цвет текста на изображении в opencv и использовать гистограмму, чтобы получить средний цвет.

возможно ли это сделать?

У меня есть этот код для сейчас:

color = ('b','g','r')
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.show()

фон изображения прозрачен

îmage

1 Ответ

2 голосов
/ 03 апреля 2020

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

В общем случае вам необходимо отделить текст от фона и собрать только гистограмму текстовых пикселей.

На изображении, которое вы разместили, мы можем предположить, что фон белый (цвет 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.
Я думаю, вам лучше изменить код и использовать для циклов.

...