6
votes

Quel est le moyen le plus rapide de convertir une image en noir et blanc pur en C #?

Avant que quelqu'un me flamme pour ne pas vérifier les autres postes, je l'ai déjà fait. J'ai une question spécifique sur l'une des techniques qui existent pour convertir une image en niveaux de gris.

J'ai lu à travers les autres messages sur la technique 3 et essentiellement copiée 3 (ColorMatrix) du tutoriel à Ce site . Cela fonctionne très rapidement. P>

Le problème que j'ai est que ce dont j'ai besoin est une image pure BW. (I.e.: Si la moyenne (R, B, G)> 200 => Blanc Autre Black). Je l'ai mis en œuvre la voie directe et cela prend presque 10 fois 10 fois l'algorithme de niveaux de gris du tutoriel. P>

Je ne suis pas expert avec le traitement de l'image et je me demandais s'il y avait un moyen de modifier le Snippet du tutoriel pour convertir des images en noir et blanc pur. Sinon, une manière efficace ferait. P>

EDIT: P>

Voici le code que j'utilise pour le noir et blanc (pas d'approche cerveau): P>

public Bitmap make_bw(Bitmap original) {

    Bitmap output = new Bitmap(original.Width, original.Height);

    for (int i = 0; i < original.Width; i++) {

        for (int j = 0; j < original.Height; j++) {

            Color c = original.GetPixel(i, j);

            int average = ((c.R + c.B + c.G) / 3);

            if (average < 200)
                output.SetPixel(i, j, Color.Black);

            else
                output.SetPixel(i, j, Color.White);

        }
    }

    return output;       

}


2 commentaires

Vous n'avez pas vraiment besoin d'une matrice de couleur pour convertir en une image 1 bit (pure noir et blanc). Essayez la deuxième solution et voyez si cela est plus rapide. (Sinon, veuillez publier votre code.)


Cal vous collez du code qui fonctionne mal? Comment quelque chose peut-il ajouter 10 fois plus de temps si vous n'ajoutez qu'un 'si' à celui-ci?


3 Réponses :


3
votes

2 commentaires

Aurait dû rechercher plus attentivement ... problème résolu, fonctionne vraiment vite.


J'ai "triché" un peu ... a vu que l'exemple à jeun dans votre lien utilisé SetColormatrix et Googled pour SetColorMatrix BW :-)



2
votes

Ce gars fait trois tests, le plus rapide étant le colormertrix comme mentionné ici. Lien externe sur la conversion d'image

Mais l'un des commentateurs affirme que la raison de la méthode directe et dangereux pixel est plus lente est des appels à .Width et .Height . Dans les bitmaps et la copie de ces valeurs aux variables locales rend l'accès direct de pixels sensiblement plus rapidement.

J'ai testé cela et il semble que la méthode dangereuse soit d'environ 2,5 fois plus rapide que d'utiliser le colormertrix . Mais il est sans doute plus impliqué et il est évident que cela nécessite que le code dangereux soit autorisé dans le projet qui pourrait ne pas être souhaitable.


1 commentaires

S'il vous plaît, n'incluez pas simplement des liens vers des articles externes sans ajouter d'exemples ici. Maintenant, le lien est mort et il n'y a aucun moyen de savoir comment mettre en œuvre cela.



3
votes

J'utilise ce code simple:

public Bitmap GrayScaleFilter(Bitmap image)
{
    Bitmap grayScale = new Bitmap(image.Width, image.Height);

    for (Int32 y = 0; y < grayScale.Height; y++)
        for (Int32 x = 0; x < grayScale.Width; x++)
        {
            Color c = image.GetPixel(x, y);

            Int32 gs = (Int32)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);

            grayScale.SetPixel(x, y, Color.FromArgb(gs, gs, gs));
        }
    return grayScale;
}


1 commentaires

Je pensais parler du moyen le plus rapide de faire ça?