[VB.NET] Comparar Imagenes

Iniciado por Shell Root, 20 Enero 2010, 21:21 PM

0 Miembros y 1 Visitante están viendo este tema.

Shell Root

Que tal, ando con una duda al crear una aplicacion, que lo unico que hace es comparar imagenes. Basicamente hace lo siguiente:

En 2 PictureBox tener la posibilidad de poner 2 Imagenes, al darle click en un Button, diga, Si son Iguales o no, y si se puede que diga por cuanto % es igual a la otra imagen.

Alguna pista de como crealo?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Debci

No se exactamente, pero y si comparas bytes por posicion del puntero seek? vas recorriendo offset por offset comprovando unas y otras y luego haces una simple regla de tres para ver cuanto coincide con cuanto.

Es una idea, quizas sea descabellado, quizás no.

Saludos

raul338

Naa...bytes por bytes??.. no creo...
yo haria que la imagen mas grande, se redimensione a la mas chica, y de ahi recien comparar (OJO, habria que poner algun filtro "suavizado" como para no borrar pixeles o etc) y despues comparas ;)

PD: Tu post se llama "comprar imagenes", no "comparar imagenes" ;-D :xD

Keyen Night

#3
Tengo una idea que podría funcionar aunque lleva algo de matemática pero bueno los programadors somos matemáticos natos :xD

Recorre todos los pixel de cada imagen comparando su valor hex, por cada pixel diferente sumaras +1 si es igual no sumaras nada en una variable A que usaras como buffer en una variable B sumaras +1 cada vez que compares un pixel con otro si al final A es igual a cero entonces la igual es igual si A es diferente que cero entonces es diferente para calcular el porcentaje entonces debes dividir  A entre B y multiplicarlo por 100, mira el ejemplo:

Código (vbnet) [Seleccionar]
Public Class Form1

    Public Function GetPixels(ByVal I As Bitmap) As List(Of Integer)
        GetPixels = New List(Of Integer)
        Dim X As Integer = 0, Y As Integer = 0

        While X <> I.Width AndAlso Y <> I.Height
            GetPixels.Add(I.GetPixel(X, Y).ToArgb)
            X += 1
            Y += 1
        End While

    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim I1 As New Bitmap("C:\1.jpg")
        Dim I2 As New Bitmap("C:\2.jpg")

        Dim A As Long = 0
        Dim B As Long = 0

        For Each C As Integer In GetPixels(I1)
            For Each D As Integer In GetPixels(I2)
                If C <> D Then
                    A += 1
                End If
                B += 1
            Next
        Next

        MsgBox("Diferentes: " & A & _
               vbNewLine & "Análizados: " & B _
               & vbNewLine & "Porcentaje de Diferencia: " & Math.Round(A / B * 100, 2) & "%")

    End Sub
End Class
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

seba123neo

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Shell Root

Image Comparison in C#
Joder, Justo lo que necesitaba. Gracias seba123neo ;·)
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

elmaro

De acá podes sacar como marcar los cambios entre imagen e imagen. Ademas de eso, el programa esta muy bueno. Espero te sirva.

http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx


seba123neo

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

nico56

Cita de: seba123neo en 22 Enero 2010, 04:04 AM
Cita de: nico56 en 21 Enero 2010, 06:29 AM
Cita de: seba123neo en 21 Enero 2010, 01:39 AM
Image Comparison in C#

Comparing Images using GDI+

Cada vez me doy mas cuenta de lo groso que este framework.

por eso es .NET , sigla de "Nunca Entendes Todo"  ;D

Jaja muy cierto, o nunca te vas a enterar de todas las clases que tiene.