Accueil > > > CONVERTIR UNE IMAGE EN NIVEAU DE GRIS
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
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
Reconnaissance d'image [VB5] [ par Fraizy ]
Bonjour, Je fais un projet dans lequel je dois décoder une image en niveau de gris (un QR code simplifié en fait). L'image en niveau de gris n'est pa
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
Conversion VB6 vers VB2008 [ par patelec ]
A l'ouverture d'un fichier *.vbp concu en VB6 j'obtiens le message suivant: Echec de la mise à niveau:Impossible de charger les composants suivants: M
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
LIST GENERICS 2LIST GENERICS 2 par JLuc01
Cliquez pour lire la suite par JLuc01
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|