Images : dithering par motif

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 023 fois - Téléchargée 30 fois

Contenu du snippet

Le dithering est une vieille technique pour créer une image monochrome à partir d'une image couleur. A une époque, ce fut utile quand les imprimantes n'étaient qu'en noir et blanc. Aujourd'hui, on l'emploie pour l'esthétisme, en particulier, pour avoir un rendu façon photo de journal.

Source / Exemple :


public static void Dithering(Bitmap bitmap)
{
	int width = bitmap.Width;
	int height = bitmap.Height;

	//le pattern à appliquer (il était à l'origine destiné à des niveaux de gris de 64)
	byte[][] pattern = new byte[][]{	new byte[]{0,32,8,40,34,2,10,42},
							new byte[]{48,16,56,24,50,18,58,26},
							new byte[]{12,44,4,36,14,46,6,38},
							new byte[]{60,28,52,20,62,30,54,22},
							new byte[]{3,35,11,43,1,33,9,41},
							new byte[]{51,19,59,27,49,17,57,25},
							new byte[]{15,47,7,39,13,45,5,37},
							new byte[]{63,31,55,23,61,29,53,21}};

	unsafe
	{
		BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

		byte* newPixel = (byte*)(void*)bmpData.Scan0;
		int offset = width % 4;
           
		for (int y = 0; y < height; y++)
		{
			for (int x = 0; x < width; x++)
			{
				//on récupère le niveau de gris sur 255
				byte pixel = (byte)(.3 * newPixel[0] + .59 * newPixel[1] + .11 * newPixel[2]);
				//on compare le pixel (réduit à 64 niveaux) au pattern (en fonction de sa position
				//par rapport à l'image
				if ((pixel>>2)>pattern[x&7][y&7])
					newPixel[0]=newPixel[1]=newPixel[2]=255;
				else
					newPixel[0]=newPixel[1]=newPixel[2]=0;

				newPixel+=3;	
			}
			newPixel += offset;
		}

		bitmap.UnlockBits(bmpData);
	}
}

Conclusion :


Cette technique fut une des premières mises en oeuvre. Voici le principe du dithering dit de Bayer :
On compare les niveaux de gris de l'image (on convertit donc notre image couleur en niveau de gris) avec un motif. Ce dernier est une matrice 8x8, ce qui donne donc 64 niveaux de gris. On compare le pixel de gris (décalé de 2 pour arriver à 64) avec le motif. Les pixels transformés plus grands que leurs éléments de matrice correspondant, sont affichés en blanc (255). Dans le cas contraire, en noir (0).

A voir également

Ajouter un commentaire

Commentaires

kamal101
Messages postés
12
Date d'inscription
samedi 24 janvier 2004
Statut
Membre
Dernière intervention
22 mars 2007

Est-ce qu'il y a quelqu'un qui sait comment faire en c# la reconnaissance de forme. Je veux trouver des mini-cercles ronds dans une image et les mettre par exemple en noir. Est-ce qu'il y a une librairie pour ça ?
tkfe
Messages postés
9
Date d'inscription
mercredi 5 janvier 2005
Statut
Modérateur
Dernière intervention
19 décembre 2007

Il y en aura d'autres ;-) Faut juste que j'ai un peu plus de temps...

Fred
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
très sympa :D
vivement la suite :p

Séb

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.