IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comparaison d'image - Problèmes de couleur


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Points : 94
    Points
    94
    Par défaut Comparaison d'image - Problèmes de couleur
    Bonjour à tous,

    J'essaye de développer une petite application qui me permettrait de comparer deux plan industrielles, le but étant d’afficher en rouge les différences entre ces deux fichiers.

    Pour l'instant j'utilise deux images JPEG de même format et je les compare en utilisant leurs tableau de byte ( bien plus rapide qu'avec getpixel).

    Mon problème est que le résultat est multicolore au lieu d’être rouge !

    J'ai beau essayer de décaler les byte, changer les valeurs de couleur mais rien n'y fait. Il y a comme un décalage.

    Si quelqu'un aurait une idée ? Merci !

    Le résultat en pièce jointe et si dessous mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
            Dim Image1Bitmap As Bitmap = TryCast(Image1, Bitmap)
            Dim Image2Bitmap As Bitmap = TryCast(Image2, Bitmap)
            Dim Image3Bitmap As New Bitmap(Image1Bitmap.Width, Image1Bitmap.Height, Image1Bitmap.PixelFormat)
     
            If Image1Bitmap Is Nothing OrElse Image2Bitmap Is Nothing Then
                Return True
            End If
     
            Dim bytes As Integer = Image1.Width * Image1.Height * (Image.GetPixelFormatSize(Image1.PixelFormat) / 8)
     
            Dim result As Boolean = True
            Dim b1bytes As Byte() = New Byte(bytes - 1) {}
            Dim b2bytes As Byte() = New Byte(bytes - 1) {}
            Dim b3bytes As Byte() = New Byte(bytes - 1) {}
     
            Dim bmd1 As BitmapData = Image1Bitmap.LockBits(New Rectangle(0, 0, Image1Bitmap.Width - 1, Image1Bitmap.Height - 1), ImageLockMode.[ReadOnly], Image1Bitmap.PixelFormat)
            Dim bmd2 As BitmapData = Image2Bitmap.LockBits(New Rectangle(0, 0, Image2Bitmap.Width - 1, Image2Bitmap.Height - 1), ImageLockMode.[ReadOnly], Image2Bitmap.PixelFormat)
            Dim bmd3 As BitmapData = Image3Bitmap.LockBits(New Rectangle(0, 0, Image3Bitmap.Width - 1, Image3Bitmap.Height - 1), ImageLockMode.[ReadWrite], Image3Bitmap.PixelFormat)
     
            Marshal.Copy(bmd1.Scan0, b1bytes, 0, bytes)
            Marshal.Copy(bmd2.Scan0, b2bytes, 0, bytes)
            Marshal.Copy(bmd3.Scan0, b3bytes, 0, bytes)
     
            ' Image 3 blanche
            For counter As Integer = 0 To b3bytes.Length - 1 Step 1
                b3bytes(counter) = 255
            Next
            'boucle sur chaque pixel
            For n As Integer = 0 To b1bytes.Length - 1 Step 3
                Dim Rvalue As Double = b1bytes(n) / b2bytes(n)
                Dim Gvalue As Double = b1bytes(n + 1) / b2bytes(n + 1)
                Dim Bvalue As Double = b1bytes(n + 2) / b2bytes(n + 2)
            'si valeur hors seuil on passe en rouge
                If (Rvalue + Gvalue + Bvalue) / 3 < 1 - NumericUpDown1.Value / 100 Or (Rvalue + Gvalue + Bvalue) / 3 > 1 + NumericUpDown1.Value / 100 Then
                    'set pixel rouge
                    b3bytes(n) = 0
                    b3bytes(n + 1) = 0
                    b3bytes(n + 2) = 255
                    result = False
                End If
            Next
     
            Marshal.Copy(b3bytes, 0, bmd3.Scan0, bytes)
     
            Image1Bitmap.UnlockBits(bmd1)
            Image2Bitmap.UnlockBits(bmd2)
            Image3Bitmap.UnlockBits(bmd3)
     
            PictureBox1.Image = Image3Bitmap
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu traites R, G, et B, mais tu as oublié le A (alpha)... Il y a donc 4 octets à traiter par pixel, et non 3. Si tu avances par 3 octets, ton 255 se retrouve alternativement dans le rouge, le vert, le bleu, et l'alpha, d'où le résultat multicolore.

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    J'ai essayé mais ça ne marche pas non plus, en fait mes images sont en 24 bpp, donc que 3 octets normalement ?

    En cherchant je suis tombé là dessus : http://bobpowell.net/lockingbits.aspx

    et là ça fonctionne bien !

    Merci quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison entre deux images: problème de luminosité.
    Par nadour dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 25/03/2014, 11h01
  2. Réponses: 8
    Dernier message: 18/04/2010, 03h40
  3. [ImageMagick] Apposer un logo à une image en PHP - Problème de couleurs
    Par Saiyan dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 25/07/2006, 18h17
  4. [IMAGE]Problème d'affichage
    Par LoLoLem dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/07/2004, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo