2 votes

est-il possible de détecter la couleur et la position d'un texte avec l'histogramme opencv en python ?

Je dois détecter la couleur du texte sur une image dans opencv et utiliser l'histogramme pour obtenir la couleur moyenne.

Est-il possible de le faire ?

J'ai ce code pour l'instant :

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()

l'arrière-plan de l'image est transparent

îmage

2voto

Rotem Points 3340

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X