|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
CONVERTIR UNE IMAGE EN NIVEAU DE GRIS
Information sur la source
Description
On peut convertir une image couleur en niveau de gris via une formule empirique liée aux composantes Bleu, vert, Rouge de l'image : 0.3 * bleu + 0.59 * vert + 0.11 rouge = niveau de gris Cette formule peut être très largement améliorée, pour ne pas multiplier des nombres à virgules ( ce qui est coûteux en performance), en multipliant les coefficients par 256. On redivise le tout par 256 par la suite.
Source
- Dim bitmaptest As Bitmap = New Bitmap("d:\image.jpg")
- Dim bitmap As Bitmap = New Bitmap(bitmaptest) 'transforme en 32 bits :)
-
- Dim width As Integer = bitmap.Width
- Dim height As Integer = bitmap.Height
-
- 'création de l'image 8 bits contenant le résultat
- Dim bitmapNivGris As Bitmap = New Bitmap(width, height, PixelFormat.Format8bppIndexed)
-
- 'Récupération de la palette 256 couleurs
- Dim pal As ColorPalette = bitmapNivGris.Palette
-
- Dim i As Integer
- 'Redéfinition de la palette
- For i = 0 To 255
- pal.Entries(i) = Color.FromArgb((255 << 24) Or (i << 16) Or (i << 8) Or i)
- Next
- 'Réaffectation de la palette à l'image
- 'car on ne possédait pas une référence (utilisez Reflector sur la Palette pour comprendre)
- bitmapNivGris.Palette = pal
-
- 'Lockbits des images initial et résultat
- Dim bmpDataOld As BitmapData = bitmap.LockBits(New Rectangle(0, 0, width, height) _
- , System.Drawing.Imaging.ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb)
- Dim bmpDataNew As BitmapData = bitmapNivGris.LockBits(New Rectangle(0, 0, width, height) _
- , ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed)
-
- 'Copie des pixels dans un tableau contenant tous les composantes Bleu, vert, rouge, alpha
- Dim oldPixel(width * height - 1) As Integer '4 octets = 4 composantes = 1 pixel
- Marshal.Copy(bmpDataOld.Scan0, oldPixel, 0, oldPixel.Length)
-
- Dim newPixel(bmpDataNew.Stride * height - 1) As Byte '1 octet = 1 pixel
- 'Pas necessaire de recuperer les donnees de l'image vierge par un Marshal.Copy :-)
-
- Dim locOld, x, y As Integer
-
- 'tables de precalcul des multiplications pour le calcul de localisation des pixels
- 'de l'ancienne image et de la nouvelle.
- Dim multiOld(height - 1) As Integer
- Dim multiNew(height - 1) As Integer
-
- For y = 0 To height - 1
- multiOld(y) = width * y
- multiNew(y) = bmpDataNew.Stride * y
- Next
-
- 'tables de precalcul des multiplications pour le calcul du niveau de gris
- Dim tabBleu(255) As Integer
- Dim tabVert(255) As Integer
- Dim tabRouge(255) As Integer
-
- 'Initialisation
- For y = 0 To 255
- tabBleu(y) = 76 * y
- tabVert(y) = 151 * y
- tabRouge(y) = 28 * y
- Next
-
- For y = 0 To height - 1
-
- For x = 0 To width - 1
- 'calcul de la localisation du pixel
- locOld = multiOld(y) + x
- 'on calcule le niveau de gris sur 255
- 'Formule ci-dessous en commentaires, à éviter car coûteuse
- 'CByte(0.3 * oldPixel(loc) + 0.59 * oldPixel(loc + 1) + 0.11 * oldPixel(loc + 2))
-
- 'on affecte le niveau de gris au pixel dans la nouvelle image
- newPixel(multiNew(y) + x) = (tabBleu(oldPixel(locOld) And &HFF) + tabVert((oldPixel(locOld) And &HFF00) >> 8) + tabRouge((oldPixel(locOld) And &HFF0000) >> 16)) >> 8
-
- Next
-
- Next
-
- 'on recopie notre nouveau tableau dans la nouvelle image
- Marshal.Copy(newPixel, 0, bmpDataNew.Scan0, newPixel.Length)
-
- bitmapNivGris.UnlockBits(bmpDataNew)
- bitmap.UnlockBits(bmpDataOld)
Dim bitmaptest As Bitmap = New Bitmap("d:\image.jpg")
Dim bitmap As Bitmap = New Bitmap(bitmaptest) 'transforme en 32 bits :)
Dim width As Integer = bitmap.Width
Dim height As Integer = bitmap.Height
'création de l'image 8 bits contenant le résultat
Dim bitmapNivGris As Bitmap = New Bitmap(width, height, PixelFormat.Format8bppIndexed)
'Récupération de la palette 256 couleurs
Dim pal As ColorPalette = bitmapNivGris.Palette
Dim i As Integer
'Redéfinition de la palette
For i = 0 To 255
pal.Entries(i) = Color.FromArgb((255 << 24) Or (i << 16) Or (i << 8) Or i)
Next
'Réaffectation de la palette à l'image
'car on ne possédait pas une référence (utilisez Reflector sur la Palette pour comprendre)
bitmapNivGris.Palette = pal
'Lockbits des images initial et résultat
Dim bmpDataOld As BitmapData = bitmap.LockBits(New Rectangle(0, 0, width, height) _
, System.Drawing.Imaging.ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb)
Dim bmpDataNew As BitmapData = bitmapNivGris.LockBits(New Rectangle(0, 0, width, height) _
, ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed)
'Copie des pixels dans un tableau contenant tous les composantes Bleu, vert, rouge, alpha
Dim oldPixel(width * height - 1) As Integer '4 octets = 4 composantes = 1 pixel
Marshal.Copy(bmpDataOld.Scan0, oldPixel, 0, oldPixel.Length)
Dim newPixel(bmpDataNew.Stride * height - 1) As Byte '1 octet = 1 pixel
'Pas necessaire de recuperer les donnees de l'image vierge par un Marshal.Copy :-)
Dim locOld, x, y As Integer
'tables de precalcul des multiplications pour le calcul de localisation des pixels
'de l'ancienne image et de la nouvelle.
Dim multiOld(height - 1) As Integer
Dim multiNew(height - 1) As Integer
For y = 0 To height - 1
multiOld(y) = width * y
multiNew(y) = bmpDataNew.Stride * y
Next
'tables de precalcul des multiplications pour le calcul du niveau de gris
Dim tabBleu(255) As Integer
Dim tabVert(255) As Integer
Dim tabRouge(255) As Integer
'Initialisation
For y = 0 To 255
tabBleu(y) = 76 * y
tabVert(y) = 151 * y
tabRouge(y) = 28 * y
Next
For y = 0 To height - 1
For x = 0 To width - 1
'calcul de la localisation du pixel
locOld = multiOld(y) + x
'on calcule le niveau de gris sur 255
'Formule ci-dessous en commentaires, à éviter car coûteuse
'CByte(0.3 * oldPixel(loc) + 0.59 * oldPixel(loc + 1) + 0.11 * oldPixel(loc + 2))
'on affecte le niveau de gris au pixel dans la nouvelle image
newPixel(multiNew(y) + x) = (tabBleu(oldPixel(locOld) And &HFF) + tabVert((oldPixel(locOld) And &HFF00) >> 8) + tabRouge((oldPixel(locOld) And &HFF0000) >> 16)) >> 8
Next
Next
'on recopie notre nouveau tableau dans la nouvelle image
Marshal.Copy(newPixel, 0, bmpDataNew.Scan0, newPixel.Length)
bitmapNivGris.UnlockBits(bmpDataNew)
bitmap.UnlockBits(bmpDataOld)
Conclusion
L'image résultat est bitmapNivGris.
Historique
- 06 octobre 2006 15:43:56 :
- L'image de sortie est une image 8 bits indexée
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Image en niveau de gris en C++ ou Autres [ par raftanelle ]
Je cherche un programme en C++, VB, ou autres me permettant de créer des images en niveau de gris. Le niveau de gris dépend de la hauteur Z. Les coord
Programme réalisant image en niveau de gis avec Coordonnées (x,y,z) [ par raftanelle ]
Je cherche un programme en C++, VB, ou autres me permettant de créer des images en niveau de gris. Le niveau de gris dépend de la hauteur Z. Les coord
transformation de niveau de gris d'une image [ par laura1978 ]
Salut,Je suis nouvelle dans ce forum et j'ai un probleme en traitement d'image.je dois ecrire un algo en c++ pour la transformation du niveau de gris
Traitement d'image, niveau de gris, seuillage,.... [ par nikko_s ]
Bonjour à tous,Je souhaite effectuer divers traitements d'images pour parvenir à un comptage de population cellulaire sur des clichés 640 par 480 issu
Conversion d'une image en niveaux de gris [ par nicolasheurtevin ]
Bonjour,Je cherche à convertir une image en niveaux de gris. J'ai vu plusieurs sources où les auteurs balayent un à un les pixels de l'image source, e
Conversion image eps -> jpeg (et tout en fait) [ par minimarc ]
bonjour à vous,je souhaiterais savoir s'il existe un moyen de convertir une image eps vers le format jpeg, et pendant qu'on y ait de n'importe quel fo
déclarer etutiliser RGB pour niveau de gris ? Comment faire ? [ par raftanelle ]
J'ai toujours des difficulter. Je ne parviens pas à utiliser RGB(10,10,10) Avec AUTOCAD 2000.sur Autocad 2004 je déclare Color1 comme ç
Problème de Picturebox [ par cire2003 ]
Lorsque je mets un picturebox dans ma fenêtre, je me retrouve avec un arrière plan gris (celui par default). En ce qui me concerne, je mets une image
Transformation image niveau de gris ---> couleurs codées [ par delvpier ]
Bonjour, quelqu'un pourrait-il me renseigner, ...ou écrire, un programme permettant de transformer une image(relief géographique)en niveaux de gris (0
tritement sur une image N/B [ par higgins91 ]
Bonjour,Je recherche un moyen de faire comme un filtre passe haut sur une image, je m'explique:J'ai des images en niveau de gris (de 0 à 255) de taill
|
Téléchargements
Logiciels à télécharger sur le même thème :
|