본문 바로가기

디지털포렌식(Digital forensic)/그림

[파일]같은 숫자를 찾아내는 코드, 9

반응형

사람은 숫자를 보고 읽고 그 숫자의 의미를 판단하지만

기계나 컴퓨터는 그렇게 스마트하지 않다.

완벽하게 일치하는 이미지라면 쉽게 찾지만 약간의 픽셀값만 달라져도 찾기 어려워한다.

찾기 어려워한다면 추가적인 코드 작업이 필요하다.

 

아래는 숫자 9 암호 이미지와 같은 이미지를 타켓이미지에서 찾아내는 코드다.

이번에는 C#으로 만들지않고 같은 .NET 프레임의 VB로 만들었다.

소스 파일은 사용된 이미지를 포함하여 아래에서 다운받을 수 있다.

왼쪽 버튼은 찾을 대상 암호를 불러오고
오른쪽 버튼은 검색 대상 이미지를 불러온다.

중앙의 수행 버튼은 암호이미지와 같은 이미지를 대상 이미지에서 찾고 빨간색 테두리 블럭을 만들어준다.

DrawRedBox( ) 함수는 그래픽을 그려주는 기능일 뿐이다.

중요한 함수는 CompareImage( ) 함수로,
이미지의 높이를 0부터 전체 높이까지, 가로폭도 0부터 전체 폭까지 픽셀 단위로 비교한다.
픽셀 단위로 비교하기 때문에 그 값이 조금만 달라도 찾을 수 없게 된다.

Imports System.Drawing.Imaging

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim openFileDialog As New OpenFileDialog()
        openFileDialog.Filter = "Image Files|*.jpg;*.jpeg;*.png;*.bmp|All Files|*.*"

        If openFileDialog.ShowDialog() = DialogResult.OK Then
            PictureBox1.Image = Image.FromFile(openFileDialog.FileName)
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim openFileDialog As New OpenFileDialog()
        openFileDialog.Filter = "Image Files|*.jpg;*.jpeg;*.png;*.bmp|All Files|*.*"

        If openFileDialog.ShowDialog() = DialogResult.OK Then
            PictureBox2.Image = Image.FromFile(openFileDialog.FileName)
        End If
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim image1 As Bitmap = CType(PictureBox1.Image, Bitmap)
        Dim image2 As Bitmap = CType(PictureBox2.Image, Bitmap)
        Dim found As Boolean = False

        For y As Integer = 0 To image2.Height - image1.Height
            For x As Integer = 0 To image2.Width - image1.Width
                If CompareImages(image1, image2, x, y) Then
                    DrawRedBox(PictureBox2, x, y, image1.Width, image1.Height)
                    found = True
                End If
            Next
        Next
    End Sub

    Private Sub DrawRedBox(pictureBox As PictureBox, x As Integer, y As Integer, width As Integer, height As Integer)
        Dim graphics As Graphics = pictureBox.CreateGraphics()
        Dim pen As Pen = New Pen(Color.Red, 3)
        graphics.DrawRectangle(pen, x, y, width, height)
        pen.Dispose()
        graphics.Dispose()
    End Sub

    Private Function CompareImages(image1 As Bitmap, image2 As Bitmap, x As Integer, y As Integer) As Boolean
        For i As Integer = 0 To image1.Width - 1
            For j As Integer = 0 To image1.Height - 1
                If image1.GetPixel(i, j) <> image2.GetPixel(x + i, y + j) Then
                    Return False
                End If
            Next
        Next
        Return True
    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class

WindowsFormsApp1.zip
0.06MB


수많은 인파들 중에서 특정 인물을 특정짓고 찾아내는 기술 이미지 처리 기술은 쉽지 않다.

728x90