Je désirerais modifier une image couleur (24 ou 32 bits) en une image niveaux de gris (8 bits par pixels).
J'ai réussi pour l'instant à modifier une image 24 bits en niveaux de
gris en remplacant les trois couleurs par la formule : (0.299 * red) +
(0.587 * green) + (0.114 * blue). Le résultat est bon mais mon image
est toujours en 24 bit, ce qui est un peu redondant.
Je voudrais donc modifier mon image 24 bits en une image 8 bits (qui
sera plus facile à manipuler pour l'application de filtres).
Merci d'avance pour vos réponses,
A bientôt,
Seb.
A voir également:
Programme qui transforme une image couleur en une image en niveau de gris
Transforme une "image couleur" en une "image en niveau de gris" - Meilleures réponses
Convertir une image couleur en niveau de gris - Meilleures réponses
Le problème est le suivant : il y a bien une propriété
Format8bppIndexed mais comme son nom l'indique, les couleurs (ou les
niveaux) sont indexées. Pour effectuer les traitements sur l'image, il
est préférable de ne pas avoir une image dont les pixels sont indexés.
C'est ce que je recherche : une conversion vers une image 8 bits non
indexée.
Et si tu fais tes traitements avant et que tu converti ensuite?
Je suis pas un expert en image, qu'est-ce que ça signifie les "niveaux de couleurs indexés" ?
Lorsque les couleurs sont indexées, l'image utilise une palette de
couleurs. Cette palette peut être de taille variable et contenir soit
des niveaux de gris soit des couleurs.
Comme tu le sais chaque pixel est représenté par une couleur, lorsque
celle-ci est indexée, le pixel contient la position de la couleur dans
la palette.
Contrairement aux images "classiques" où le pixel contient directement la valeur de la couleur.
De par ce fait, lorsque les couleurs sont indexées il est difficile de traiter les images en modifiant directement le pixel.
J'espère que je suis assez clair.
Merci encore pour ton intérêt à ma question,
Seb.
Vous n’avez pas trouvé la réponse que vous recherchez ?
private void GrayScale( )
{
bmp = new Bitmap( "Lena.jpg" );
gray = new Bitmap( bmp.Width, bmp.Height, PixelFormat.Format16bppRgb555 ); // Ou 565.
int rgb;
Color pixel;
for ( int x = 0; x < bmp.Width; x++ )
{
for ( int y = 0; y < bmp.Height; y++ )
{
pixel = bmp.GetPixel( x, y );
// Ou ça : rgb = ( int )( pixel.R + pixel.G + pixel.B ) / 3;
rgb = ( int )( pixel.R * 0.3 + pixel.G * 0.59 + pixel.B * 0.11 );
gray.SetPixel( x, y, Color.FromArgb( rgb, rgb, rgb ) );
}
}
//gray.Save( "Gray.bmp", ImageFormat.Bmp );
}
J'imagine que ça dépend peut être du format mais pour moi une image 8bpp ça signifie une image indexée. Si tu veux quelque chose de rapide pour appliquer des filtres il faudra passer par les pointeurs.
Voici ce que j'entends par image 8 bits non-indexé en niveaux de gris : 1 octet = 256 niveaux de gris possibles.
Maintenant tu me fais hésiter. Est-ce possible d'avoir des images 8 bits non indexées ?
Si l'on considère une image 8 bits indexée, comment appliquer les
matrices directement sur les pixels ? Faut-il aller rechercher la
valeur du pixel dans la palette ?