Question

Je fais un peu de traitement d'image et je besoin d'un algorithme d'équilibrage automatique des blancs qui est pas trop intensive en termes de temps de calcul du processeur. Les recommandations?

EDIT: et si elle est pertinente à l'efficacité, je serai la mise en œuvre en Java avec des images de couleur comme un tableau d'entiers

.
Était-ce utile?

La solution

Un algorithme relativement simple consiste à calculer la moyenne des teintes (dans HSV ou HSL) des pixels les plus brillants et les plus sombres sur l'écran. Dans une pincée, aller avec les plus brillants pixel seulement. Si les teintes entre les plus brillants et les plus sombres sont trop différentes, aller avec le pixel brillant. Si l'obscurité est proche noir aller avec le pixel brillant.

Pourquoi regarder même au pixel noir? Parfois, l'obscurité n'est pas près de noir, et fait allusion à la lumière ambiante ou du brouillard ou de la brume.

Cela sens pour vous si vous êtes un utilisateur de Photoshop lourd. Faits saillants sur une photo ne sont pas liés (ou faiblement liés) à la couleur sous-jacente de l'objet. Ils sont votre meilleure représentation de la distribution de couleur de la lumière, à moins que l'image est si surexposée que tout a dépassé les CCDs.

Réglez ensuite les couleurs de tous les pixels.

Vous aurez besoin RVB rapide à HSV et HSV aux fonctions RGB. (Mais peut-être vous pouvez travailler en RVB pour les corrections de pixels avec une LUT ou interpolation linéaire).

Vous ne voulez pas aller par la couleur moyenne des pixels ou la couleur la plus populaire. De cette façon est la folie.

Pour trouver rapidement la couleur la plus claire (et la plus foncée), vous pouvez travailler en RVB, mais vous devriez avoir des multiplicateurs pour le vert, le rouge et le bleu. Sur un écran RVB, 255 vert est plus lumineux que 255 rouge qui est plus clair que 255 bleu. Je l'habitude d'avoir de bons multiplicateurs dans ma tête, mais hélas, ils ont fui ma mémoire. Vous pouvez probablement google pour eux.

Cela échouera dans une image qui n'a pas de points forts. Un mur peint mat, par exemple. Mais je ne sais pas ce que vous pouvez faire à ce sujet.


Il y a beaucoup d'améliorations à apporter à cet algorithme simple. Vous pouvez en moyenne plusieurs pixels lumineux, grille l'image et saisir les pixels lumineux et sombres de chaque cellule, etc. Vous trouverez quelques modifications évidentes après la mise en œuvre de l'algorithme.

Autres conseils

GIMP utilise apparemment un algorithme très simple pour l'équilibrage automatique des blancs. http://docs.gimp.org/en/gimp-layer-white -balance.html

  

La commande de balance des blancs ajuste automatiquement les couleurs de la couche active en étirant le Rouge, Vert et Bleu canaux séparément. Pour ce faire, il élimine les couleurs de pixel à chaque extrémité de la Croix-Rouge, Vert et Bleu qui sont histogrammes utilisés par seulement 0,05% des pixels de l'image et étend l'autonomie restante, autant que possible. Le résultat est que les couleurs de pixels qui se produisent très rarement sur les bords extérieurs des histogrammes (peut-être des morceaux de poussière, etc.) ne nuisent pas à les valeurs minimales et maximales utilisées pour étirer les histogrammes, par rapport à Étalement de contraste. Comme « Stretch Contrast », cependant, il peut y avoir des changements de teinte dans l'image résultante.

Il y a un peu plus de peaufinage que ce qui est décrit ici depuis ma première tentative de mise en œuvre cela fonctionne semble fonctionner pour la plupart des photos, mais d'autres photos semblent avoir des artefacts ou qui contiennent trop de l'un rouge vert ou bleu: /

@Charles Ma a suggéré d'utiliser l'algorithme de balance des blancs Gimp. Dans python et numpy cela pourrait ressembler à ceci:

# white balance for every channel independently
def wb(channel, perc = 0.05):
    mi, ma = (np.percentile(channel, perc), np.percentile(channel,100.0-perc))
    channel = np.uint8(np.clip((channel-mi)*255.0/(ma-mi), 0, 255))
    return channel

image = cv2.imread("foo.jpg", 1) # load color
imWB  = np.dstack([wb(channel, 0.05) for channel in cv2.split(img)] )

il est rapide, simple et donne des résultats assez décents

algorithmes d'équilibrage des blancs sont difficiles. Même les appareils photo numériques se tromper de temps en temps, même si ils savent beaucoup d'informations supplémentaires sur l'image -. Par exemple si le flash a été utilisé, et le niveau de lumière

Pour commencer, je voudrais juste rouge moyen, vert et bleu, et l'utiliser comme point de la balance des blancs. Fixer des limites sur le sujet - restent dans les fourchettes de tungstène, fleurissant, et la lumière du jour. Il ne sera pas parfait, mais quand son mal, il sera relativement facile d'expliquer pourquoi.

Un algorithme récemment publié est l'algorithme de distribution de couleur et il peut être trouvé ici: http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf Dans le document il y a aussi la référence au code source Matlab ( http://www.comp.nus.edu.sg/~whitebal/illuminant/files/ illuminantEstimator.m ). Il est un algorithme simple qui peut être facilement programmé et les résultats montrent qu'il est très rapide.

Si vous avez besoin plus rapide et en même temps précise la balance des blancs (constance des couleurs) algorithmes, vous devriez vérifier ce site: http://www.fer.unizg.hr/ipg/resources/color_constancy/

Il existe plusieurs algorithmes avec leur source respective codées qui pourraient être seulement ceux que vous recherchez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top