“Standard” RVB en niveaux de Gris de Conversion
Je suis en train d'écrire un convertisseurs algorithme qui prend une image JPEG et retourne sa PGM (Portable à Carte Grise) version.
Le problème est que je ne peux pas comprendre comment le "officielle" JPG->PGM convertitors de travail en termes de la valeur à affecter à la finale du pixel (je suppose, 0->255) en commençant par le classique format RGB.
Au début, j'ai utilisé cette formule (c'est la même que celle utilisée par OpenCV est CV_RGB2GRAY de conversion):
0.30*R + 0.59*G + 0.11*B = val
J'ai écrit un code simple pour tester mes résultats: il prend une couleur de l'image et de sa version PGM (déjà convertis à l'aide de GIMP). Puis il convertit la couleur de l'image à l'aide de la formule précédente. L'objectif est d'avoir une image en niveaux de gris qui est le pixel-à-pixel égal à la PGM entrée.
À ce stade, il ne retourne pas les mêmes valeurs. Pouvez-vous m'aider?
Êtes-vous sûr que c'est ce qu'il fait? Que faire si il décode seulement l'axe de l'avion et ignore la couleur-les coefficients? Vous auriez un bruit différent, et ces facteurs peuvent être différentes.
Désolé, je ne comprends pas votre post
OriginalL'auteur TheUnexpected | 2013-07-12
Vous devez vous connecter pour publier un commentaire.
Il y a probablement un réglage du gamma dans la conversion de ceux "officiels" sont les outils de l'aide.
C'est, ce n'est pas seulement une transformation linéaire.
Voir Wikipédia cette section pour plus de détails: de la Conversion des couleurs en niveaux de gris
Je crois que vous voulez utiliser la formule pour
Csrgb
.L'essayer et voir si elle correspond à des résultats que vous attendez.
Fondamentalement, vous aurez à le faire:
R, G, B
couleur (dans[0,1]
gamme)0..255
au lieu de cela, il suffit de diviser par255.0
Clinear = 0.2126 R + 0.7152 G + 0.0722 B
Csrgb
selon c'est la formule, basée surClinear
Csrgb = 12.92 Clinear
quandClinear <= 0.0031308
Csrgb = 1.055 Clinear1/2.4 - 0.055
quandClinear > 0.0031308
J'ai également ajouté un WolframAlpha complot pour vous afin que vous puissiez voir la non-linéaires de la forme de la correction de gamma.
Timothée, s'il vous plaît corrigez-moi si je me trompe, mais je pense que après l'étape (1) que vous avez à transformer les valeurs d'intensité linéaire, depuis quand vous prenez les valeurs RVB à partir d'un fichier, ils sont déjà gamma-codé avec la puissance 1/2.4. Donc, vous devez d'abord supprimer cet encodage par application de la transformation avec la puissance de 2,4, et c'est seulement alors que les étapes (2) et (3) de votre réponse. Est ce que le droit?
Vous êtes correct. C'est développer, trouver linéaire de luminance, puis de compresser.
OriginalL'auteur Timothy Shields
À harold de point sur le "Y" d'avion: couleur standard Jpeg sont codées à l'aide de la YCbCr palette, où Y est la composante de luminance (c'est à dire la luminosité) et Cb et Cr sont le bleu de différence et rouge de la différence des composants chromatiques. Donc, une façon de transformer un JPEG en couleur en niveaux de gris est simplement déposer les composantes Cb et Cr.
Il y a un utilitaire appelé
jpegtran
que ne peut le faire sans perte, à l'aide de la-grayscale
option. (La perte de la partie serait vraiment seulement affaire si vous voulais retrouver avec un JPEG et pas de PGM, pour éviter perte de génération.) En tout cas, ce serait sans doute le moyen le plus rapide pour faire cette transformation, parce qu'il n'a même pas de décoder l'image en pixels, beaucoup moins de faire des maths sur chacun d'eux.OriginalL'auteur Robert Fleming
En théorie, avec un peu de pixels (3, dans ce cas), vous pouvez déterminer ce que leur algorithme est en train de faire.
Juste choisissez vos trois pixels (p1, p2, p3), leur valeur RVB et leurs PGM de la valeur de gris, et vous avez:
RedConstant * p1.redValue + GreenConstant * p1.greenValue + BlueConstant * p1.blueValue = p1.grayValue
RedConstant * p2.redValue + GreenConstant * p2.greenValue + BlueConstant * p2.blueValue = p2.grayValue
RedConstant * p3.redValue + GreenConstant * p3.greenValue + BlueConstant * p3.blueValue = p3.grayValue.
Alors de résoudre ce problème ("equation solver" ou quelque chose) et de voir quels sont les constantes qu'ils utilisent.
1) Êtes-vous sûr que vous avez choisi la même pixels RVB et de la valeur de gris? 2) de cet article: tannerhelland.com/3643/grayscale-image-algorithm-vb6 j'ai vu qu'ils étaient plusieurs RVB-PGM algorithme. Toutes les essayer et d'essayer de découvrir qui est utilisé. Bonne chance!
Que faire si je vous dis que je n'ai pas trouvé de méthode valide?
Eh bien, GIMP probablement utiliser leurs propres bizarre algorithme, quel est le réel but de tenter de recréer exactement leur convertisseur?
Le processus de PGM la conversion est une sous-partie d'un algorithme. Après quelques tests, j'ai vu que les résultats de cet algorithme sont mieux si j'utilise un "GIMP" PGM image d'entrée, et pas une version simplifiée créée avec toutes ces méthodes. J'ai donc bien que le vrai PGM format décrit les valeurs des pixels d'une manière qui semblent être plus... "gérable" par mon algorithme. J'ai aussi essayé de regarder GIMP code, j'ai trouvé une possible conversion de point, mais il n'est pas lisible...
OriginalL'auteur Fabinout
ALGORITHME SIMPLE POUR CONVERTIR IMAGE RVB EN NIVEAUX DE GRIS DANS OPENCV PYTHON!
J'ai utilisé les commentaires donc le code est auto-explicatif.Mais il fonctionne rapidement.
J'ai DONC utilisé ce fichier image ...
Mon programme générés à la suite de fichier en niveaux de Gris ..
Donc, après le chargement de l'image, le tout peut être réduit à
gr = img1[:,:,0]*0.07 + img1[:,:,1]*0.72 + img1[:,:,2]*0.21
cv2.imwrite("test1.png", gr)
. Sur ma machine de votre code avec votre image 0.41 secondes, mon code 0.06; la différence est encore plus dramatique, avec des images plus grandes.OriginalL'auteur bad programmer
Convertit un seul pixel d'entrée dans le modèle colorimétrique RVB par défaut d'un gris unique pixel.
OriginalL'auteur Tomka Koliada
Méthode de la moyenne est le plus simple. Vous avez juste à prendre la moyenne des trois couleurs. Depuis sa une image RVB, donc cela signifie que vous devez ajouter r à g avec b, puis le diviser par 3 pour obtenir vos propres niveaux de gris de l'image.
Sa fait de cette façon.
Si vous avez une image en couleur comme l'image ci-dessus et que vous souhaitez les convertir en niveaux de gris à l'aide de méthode de la moyenne.
OriginalL'auteur