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 :

Methodologie Comparaison d'image [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Par défaut Methodologie Comparaison d'image
    Bonjour à tous,

    Je souhaite réaliser un petit comparateur d'image pour vérifier des plans.
    Les plans sont généralement au format A0 et on environ une résolution de 6000 x 4000 pixels.

    Je souhaiterais savoir si quelqu'un peux me conseiller une méthodologie pour cela ?

    J'ai déjà testé le pixel par pixel, très performant en résultat mais assez long, sinon une librairie nommée TestAPI mais qui plante car les images sont trop volumineuses.

    Merci d'avance !

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    pour le pixel par pixel il ne faut pas passer par la méthode getpixel
    je crois qu'il faut marshaler le tout (de la classe marshal) pour avoir un tableau d'octets, et là ca sera rapide
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Par défaut
    Bon j'ai pu réaliser quelque chose en m'aidant du net.

    Le résultat n'est pas bon, j'ai beaucoup de bruit sur l'image de sortie.
    Si je teste deux images strictement identique le résultat est bon il me sort une image net.
    Si je fais une petite modification sur Paint de l'une des deux image, là du bruit apparaît comme s'il y avait des petites différences de composante entre deux pixels qui devrait être identique.

    Si dessous mon code, les deux images sont mises dans des tableaux puis on compare pixel par pixel en vérifiant que les composantes sont égales sinon on passe le pixel en rouge :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    Public Class Form1
     
     
        Public g_RowSizeBytes As Integer
     
        Public g_PixBytes1() As Byte
        Public g_PixBytes2() As Byte
     
        Private m_BitmapData1 As BitmapData
        Private m_BitmapData2 As BitmapData
     
        ' Lock the bitmap's data.
        Public Sub LockBitmap(ByVal bm As Bitmap, ByRef m_BitmapData As BitmapData, ByRef g_PixBytes() As Byte)
            ' Lock the bitmap data.
            Dim bounds As Rectangle = New Rectangle( _
                0, 0, bm.Width, bm.Height)
            m_BitmapData = bm.LockBits(bounds, _
                Imaging.ImageLockMode.ReadWrite, _
                Imaging.PixelFormat.Format24bppRgb)
            g_RowSizeBytes = m_BitmapData.Stride
     
            ' Allocate room for the data.
            Dim total_size As Integer = m_BitmapData.Stride * _
                m_BitmapData.Height
            ReDim g_PixBytes(total_size)
     
            ' Copy the data into the g_PixBytes array.
            Marshal.Copy(m_BitmapData.Scan0, g_PixBytes, _
                0, total_size)
        End Sub
     
        Public Sub UnlockBitmap(ByVal bm As Bitmap, ByRef m_BitmapData As BitmapData, ByRef g_PixBytes() As Byte)
            ' Copy the data back into the bitmap.
            Dim total_size As Integer = m_BitmapData.Stride * _
                m_BitmapData.Height
            Marshal.Copy(g_PixBytes, 0, _
                m_BitmapData.Scan0, total_size)
     
            ' Unlock the bitmap.
            bm.UnlockBits(m_BitmapData)
     
            ' Release resources.
            g_PixBytes = Nothing
            m_BitmapData = Nothing
        End Sub
     
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            ' Lock the bitmap data.
     
            Dim bm1 As New Bitmap("C:\Image1.jpg")
            Dim bm2 As New Bitmap("C:\Image2.jpg")
     
            LockBitmap(bm1, m_BitmapData1, g_PixBytes1)
            LockBitmap(bm2, m_BitmapData2, g_PixBytes2)
     
     
     
            Dim pix = 0
            For Y = 0 To bm1.Height - 1
                For X = 0 To bm1.Width - 1
                    'comparaison de pixel
                    If Not (g_PixBytes1(pix) = g_PixBytes2(pix) And g_PixBytes1(pix + 1) = g_PixBytes2(pix + 1) And g_PixBytes1(pix + 2) = g_PixBytes2(pix + 2)) Then
                        g_PixBytes2(pix) = 0
                        g_PixBytes2(pix + 1) = 0
                        g_PixBytes2(pix + 2) = 255
                    End If
                    pix += 3
     
                Next X
            Next Y
     
            ' Unlock the bitmap data.
            UnlockBitmap(bm1, m_BitmapData1, g_PixBytes1)
            UnlockBitmap(bm2, m_BitmapData2, g_PixBytes2)
     
            bm2.Save("C:\Image_result.jpg", ImageFormat.Jpeg)
     
     
        End Sub
     
    End Class

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

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Par défaut
    C'est bon j'ai trouvé !

    En fait mon code marche bien, mon problème de bruit est dû à la compression Jpeg car lors de la compression de l'image modifiée, certain pixel peuvent avoir leurs composantes légèrement modifié.

    Je vais donc corrigé mon code en appliquant un critère de tolérance sur chaque composante.


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

Discussions similaires

  1. [Débutant] Methodologie Comparaison d'image
    Par a.floranc dans le forum Windows Forms
    Réponses: 0
    Dernier message: 23/01/2013, 12h39
  2. comparaison deux images
    Par nicolovitch dans le forum Windows
    Réponses: 3
    Dernier message: 27/04/2007, 17h25
  3. Comparaison d'images
    Par Atomikx dans le forum Multimédia
    Réponses: 4
    Dernier message: 12/04/2007, 14h42
  4. Comparaison d'images
    Par marion400 dans le forum Images
    Réponses: 6
    Dernier message: 03/01/2007, 18h08
  5. Comparaison d'images
    Par tmator dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 27/07/2005, 15h06

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