علیرضا مداح
شنبه 18 تیر 1384, 17:29 عصر
مقایسه ی دو عکس
این تاپیک در جهت بحث بر روی روش های مختلف مقایسه ی دو تصویر و در نهایت انتخاب بهترین روش برای پیاده سازی این کار ایجاد گردیده است .
در اینجا دو روش برای مقایسه ی دو عکس با یکدیگر بیان میشوند ، اما قبل از اعمال هر یکی از دو روش ابتدا میبایست اندازه ی دو تصویر چک شوند و در صورتی که اندازه ی آنها یکی نبودند به سرعت متوجه خواهیم شد که این دو تصویر با یکدیگر تفاوت دارند .
راه اول :
بعد از چک نمودن سایز دو تصویر ، ما از طریق تابع GetPixel مربوط به کلاسBitmap هر یک از پیکسلهای تصویر اول را با پیکسل نظیر در تصویر دوم مقایسه میکنیم و در صورتی که حتی یک پیکسل از دو تصویر با یکدیگر برابر نبودند ، دو تصویر نیز با یکدیگر یکی نخواهند بود ، حال به کد زیر توجه کنید :
Function CompareImagesByPixel(ByVal FirstBMP As Bitmap, ByVal SecondBMP As Bitmap) As Boolean
Dim AreSizesEqual, AreIdentical As Boolean
AreIdentical = True
'ابتدا سایز دو تصویر را با یکدیگر مقایسه میکنیم
AreSizesEqual = (FirstBMP.Size.ToString = SecondBMP.Size.ToString)
If AreSizesEqual = False Then
Return False
Exit Function
End If
'سپس از طریق یک حلقه ، تک تک پیکسلهای دو تصویر را با یکدیگر مقایسه مینماییم
For X As Integer = 0 To FirstBMP.Width - 1
For Y As Integer = 0 To FirstBMP.Height - 1
If Not (FirstBMP.GetPixel(X, Y).ToString = SecondBMP.GetPixel(X, Y).ToString) Then
AreIdentical = False
Exit For
End If
Next Y
Next
Return AreIdentical
End Function
اما باید توجه داشت که اعمال این روش در جهت مقایسه ی دو تصویر وقت گیر میباشد ، لذا میتوانیم از روش دیگری استفاده نماییم .
راه دوم :
در این روش میبایست از مقایسه ی مقدار Hash شده ی دو تصویر با یکدیگر استفاده نماییم . الگوریتمهای Hash متنوعی در فضای نام System.Security.Cryptography فراهم آورده شده اند . در اینجا ما از کلاس SHA256Managed در جهت پیاده سازی الگوریتم SHA1 استفاده خواهیم نمود . متد ComputeHash مربوط به این کلاس آرایه ای از بایت را به عنوان پارامتر ورودی دریافت و مقدار Hash شده ی 256 بیتی از داده ی مورد نظر را تولید مینماید . بدین ترتیب با Hash نمودن دو تصویر مورد نظر و مقایسه ی آنها با یکدیگر میتوانیم به یکی بودن دو عکس با یکدیگر پی ببریم .
Function CompareImagesByHashing(ByVal FirstBMP As Bitmap, ByVal SecondBMP As Bitmap) As Boolean
'ابتدا سایز دو تصویر را با یکدیگر مقایسه میکنیم
Dim AreSizesEqual, AreIdentical As Boolean
AreIdentical = True
AreSizesEqual = (FirstBMP.Size.ToString = SecondBMP.Size.ToString)
If AreSizesEqual = False Then
Return False
Exit Function
End If
'نمونه ی از کلاس
'ImageConverter
'در جهت تبدیل دو تصویر به آرایه ای از بایتها ایجاد مینماییم
Dim ImageCon As New ImageConverter
Dim arrImage1(1), arrImage2(1) As Byte
'دو تصویر را به آرایه ای از بایتها تبدیل مینماییم
arrImage1 = ImageCon.ConvertTo(FirstBMP, arrImage1.GetType)
arrImage2 = ImageCon.ConvertTo(SecondBMP, arrImage2.GetType)
'نمونه ای از کلاس
'SHA256Managed
'ایجاد کرده و هر یک از دو تصویر را توسط متد
'ComputeHash
'که مقدار بازگشتی آن آرایه ای از بایتها میباشد ، هش مینماییم .
Dim SHA As New System.Security.Cryptography.SHA256Managed
Dim Image1_Hashed(), Image2_Hashed() As Byte
Image1_Hashed = SHA.ComputeHash(arrImage1)
Image2_Hashed = SHA.ComputeHash(arrImage2)
'سپس هر یک از اعضای دو آرایه را با یکدیگر مقایسه مینماییم
For iHash As Integer = 0 To Image1_Hashed.Length - 1
If Not (Image1_Hashed(iHash) = Image2_Hashed(iHash)) Then
AreIdentical = False
Exit For
End If
Next
Return AreIdentical
End Function
این تاپیک در جهت بحث بر روی روش های مختلف مقایسه ی دو تصویر و در نهایت انتخاب بهترین روش برای پیاده سازی این کار ایجاد گردیده است .
در اینجا دو روش برای مقایسه ی دو عکس با یکدیگر بیان میشوند ، اما قبل از اعمال هر یکی از دو روش ابتدا میبایست اندازه ی دو تصویر چک شوند و در صورتی که اندازه ی آنها یکی نبودند به سرعت متوجه خواهیم شد که این دو تصویر با یکدیگر تفاوت دارند .
راه اول :
بعد از چک نمودن سایز دو تصویر ، ما از طریق تابع GetPixel مربوط به کلاسBitmap هر یک از پیکسلهای تصویر اول را با پیکسل نظیر در تصویر دوم مقایسه میکنیم و در صورتی که حتی یک پیکسل از دو تصویر با یکدیگر برابر نبودند ، دو تصویر نیز با یکدیگر یکی نخواهند بود ، حال به کد زیر توجه کنید :
Function CompareImagesByPixel(ByVal FirstBMP As Bitmap, ByVal SecondBMP As Bitmap) As Boolean
Dim AreSizesEqual, AreIdentical As Boolean
AreIdentical = True
'ابتدا سایز دو تصویر را با یکدیگر مقایسه میکنیم
AreSizesEqual = (FirstBMP.Size.ToString = SecondBMP.Size.ToString)
If AreSizesEqual = False Then
Return False
Exit Function
End If
'سپس از طریق یک حلقه ، تک تک پیکسلهای دو تصویر را با یکدیگر مقایسه مینماییم
For X As Integer = 0 To FirstBMP.Width - 1
For Y As Integer = 0 To FirstBMP.Height - 1
If Not (FirstBMP.GetPixel(X, Y).ToString = SecondBMP.GetPixel(X, Y).ToString) Then
AreIdentical = False
Exit For
End If
Next Y
Next
Return AreIdentical
End Function
اما باید توجه داشت که اعمال این روش در جهت مقایسه ی دو تصویر وقت گیر میباشد ، لذا میتوانیم از روش دیگری استفاده نماییم .
راه دوم :
در این روش میبایست از مقایسه ی مقدار Hash شده ی دو تصویر با یکدیگر استفاده نماییم . الگوریتمهای Hash متنوعی در فضای نام System.Security.Cryptography فراهم آورده شده اند . در اینجا ما از کلاس SHA256Managed در جهت پیاده سازی الگوریتم SHA1 استفاده خواهیم نمود . متد ComputeHash مربوط به این کلاس آرایه ای از بایت را به عنوان پارامتر ورودی دریافت و مقدار Hash شده ی 256 بیتی از داده ی مورد نظر را تولید مینماید . بدین ترتیب با Hash نمودن دو تصویر مورد نظر و مقایسه ی آنها با یکدیگر میتوانیم به یکی بودن دو عکس با یکدیگر پی ببریم .
Function CompareImagesByHashing(ByVal FirstBMP As Bitmap, ByVal SecondBMP As Bitmap) As Boolean
'ابتدا سایز دو تصویر را با یکدیگر مقایسه میکنیم
Dim AreSizesEqual, AreIdentical As Boolean
AreIdentical = True
AreSizesEqual = (FirstBMP.Size.ToString = SecondBMP.Size.ToString)
If AreSizesEqual = False Then
Return False
Exit Function
End If
'نمونه ی از کلاس
'ImageConverter
'در جهت تبدیل دو تصویر به آرایه ای از بایتها ایجاد مینماییم
Dim ImageCon As New ImageConverter
Dim arrImage1(1), arrImage2(1) As Byte
'دو تصویر را به آرایه ای از بایتها تبدیل مینماییم
arrImage1 = ImageCon.ConvertTo(FirstBMP, arrImage1.GetType)
arrImage2 = ImageCon.ConvertTo(SecondBMP, arrImage2.GetType)
'نمونه ای از کلاس
'SHA256Managed
'ایجاد کرده و هر یک از دو تصویر را توسط متد
'ComputeHash
'که مقدار بازگشتی آن آرایه ای از بایتها میباشد ، هش مینماییم .
Dim SHA As New System.Security.Cryptography.SHA256Managed
Dim Image1_Hashed(), Image2_Hashed() As Byte
Image1_Hashed = SHA.ComputeHash(arrImage1)
Image2_Hashed = SHA.ComputeHash(arrImage2)
'سپس هر یک از اعضای دو آرایه را با یکدیگر مقایسه مینماییم
For iHash As Integer = 0 To Image1_Hashed.Length - 1
If Not (Image1_Hashed(iHash) = Image2_Hashed(iHash)) Then
AreIdentical = False
Exit For
End If
Next
Return AreIdentical
End Function