반응형
사람은 숫자를 보고 읽고 그 숫자의 의미를 판단하지만
기계나 컴퓨터는 그렇게 스마트하지 않다.
완벽하게 일치하는 이미지라면 쉽게 찾지만 약간의 픽셀값만 달라져도 찾기 어려워한다.
찾기 어려워한다면 추가적인 코드 작업이 필요하다.
아래는 숫자 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
수많은 인파들 중에서 특정 인물을 특정짓고 찾아내는 기술 이미지 처리 기술은 쉽지 않다.
728x90
'디지털포렌식(Digital forensic) > 그림' 카테고리의 다른 글
[파일] WaterMark 암호, Top Secret (2) | 2023.09.03 |
---|---|
[파일]암호를 가리는 모자이크 암호(Mosaic Cipher) (0) | 2023.09.01 |
[파일]그림 안에 그림 은닉 기술, Steganography (0) | 2023.08.30 |
그림색에 RGB로 심은 암호, ANSAN (1) | 2023.08.26 |
기호 픽토그램 암호, #&#*#☆★#&&* (1) | 2023.08.25 |