Dans l'image d'exemple que vous avez postée, il est possible d'approximer la couleur moyenne du texte par des histogrammes donnés.
Dans le cas général, vous devez séparer le texte de l'arrière-plan, et collecter l'histogramme des pixels du texte uniquement.
Dans l'image que vous avez postée, nous pouvons supposer que le fond est blanc (couleur RVB d'environ [255, 255, 255]), et que le texte est sombre (toutes les valeurs des composantes de couleur RVB du texte sont faibles).
Vous pouvez utiliser les étapes suivantes :
- Recueillir les histogrammes des canaux de couleur rouge, vert et bleu.
- Supprimez toutes les valeurs élevées des histogrammes (mettez la valeur de l'histogramme à zéro).
Supposons que les valeurs élevées proviennent de pixels d'arrière-plan.
- Calculez la somme des histogrammes.
La somme représente le nombre de pixels dans l'image originale.
- Calculer la somme des pixels de l'image originale selon l'histogramme.
Exemple : Si h[100] = 10
Il y a donc 10 pixels de valeur 100 dans l'image.
La somme des 10 pixels est de 100*10.
La somme des pixels de l'image originale est : h[0]*0 + h[1]*1 + h[2]*2...
- Calculez la moyenne - divisez la somme par le nombre.
Voici le code :
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))
Note :
J'ai délibérément gardé le code simple, sans boucles for.
Je pense que vous devriez modifier le code, et utiliser des boucles for.