PDA

مشاهده نسخه کامل : چگونه تصاوير را با يكديگر مقايسه كنيم؟



ravegoat
12-09-11, 13:27
مقدمه:

در .Net نمي توان دو تصوير را با دستور شرطي و استفاده از عملگر تساوي با يكديگر مقايسه كرد. به عبارت ديگر كد زير يك فرمان غلط است:



Dim a,b As Bitmap
'Runtime Error:
If a = b Then MsgBox("The two pictures are same")

پس بايد به دنبال راه ديگري باشيم.

با يك منطق ساده مي توان اين نتيجه را گرفت كه دو تصوير زماني مشابه اند كه اندازه ي آن ها (پهنا و ارتفاع) با هم برابر بوده و رنگ تمامي پيكسل هاي آن دو نظير به نظير با هم برابر باشد.

بر اساس منطق فوق براي مقايسه ي دو تصوير نياز داريم كه رنگ تمامي پيكسل هاي آن ها را با هم مقايسه كنيم. از ديد برنامه نويسي بايد از دو حلقه ي تو در تو استفاده كرد به گونه اي كه يك حلقه پيكسل ها را در راستاي طولي و ديگري پيكسل ها را در راستاي عرضي پويش كند. پويش به محض يافتن تفاوت ميان دو پيكسل متوقف مي شود و مقداري جهت اعلام عدم تطابق دو عكس برگردانده مي شود.
اما اين سوال پيش مياد آيا اين روش كارايي لازم را دارد؟
اين پرسش پاسخ قطعي ندارد. دو تصوير مشابه به ابعاد 1440x900 px را در نظر مي گيريم. الگوريتم ارايه شده در بالا براي تاييد مشابهت دو تصوير بايد 1440*900=1296000 پيكسل را در هر تصوير نظير به نظير با هم مقايسه كند كه پروسه اي بسيار زمان بر خواهد بود.
حال دو تصوير ديگر را با اندازه ي مشابه در نظر مي گيرم به طوري كه در مورد تشابه آن دو اطلاعي نداريم. اگر الگوريتم اولين پيكسل را بررسي كند و پيكسل ها متفاوت باشند، پروسه خيلي سريع در همين ابتدا به پاسخ مي رسد (در كم تر از يك ميلي ثانيه).

با كمي گشت و گذار در اينترنت مي توانيم روش هايي جالب ديگري را براي مقايسه ي تصاوير بيابيم. يكي از روش هايي موجود تبديل بايت هاي دو تصوير به دو رشته ي منحصر به فرد است. در واقع ما به هر تصوير مي توانيم يك اثر انگشت اختصاص دهيم. اين كار را مي توان با روش هاي Hashing و رمزنگاري مانند MD5 انجام داد. اين روش به مراتب سريع تر از الگوريتم قبلي است.
حال بياييم كارايي اين روش را نيز تحليل كنيم. بسته به روش در هم ريختن بايت ها، ممكن است هش كردن تصاوير بسيار بزرگ امكان پذير نباشد. از طرفي تغييرات بسيار جزيي در بايت هاي تصوير مي تواند عبارت اثر انگشت آن را كاملا" دگرگون كند. در نتيجه هنگام مقايسه ي فايل هاي تصويري حاوي EXIF (Property Item) نظير نرم افزار توليد عكس، مقدار ISO و غيره، اين عامل مي توان مشكل زا باشد. به عبارتي اين روش دو تصوير مشابه اما با داده هاي Exif متفاوت را به اشتباه مطابق يكديگر نمي داند.
براي رفع اين مشكل مي توانيم تصاوير را ابتدا به قالب BMP ببريم كه سبب حذف داده هاي Exif مي شود و سپس عمل Hashing را روي بايت هاي تصاوير تبديل شده اجرا كنيم. بديهي است كه با اين كار سرعت الگوريتم كاهش مي يابد.

الگوريتم آخر كه به معرفي آن مي پردازيم، ذخيره ي تصاوير در Memory Stream ها براي مقايسه است. در اين روش مستقيما" مي توان با تعيين ImageFormat از نوع BMP، داده هاي Exif را حذف كرد. سپس با فرمان Equal ، مي توانيم اين Memory Stream ها را مقايسه كنيم. به علاوه در اين روش بدون رخ دادن خطاي GDI+، مي توان تمامي منابع اشغال شده توسط مموري استريم ها را با فرمان Dispose آزاد كرد.

نتيجه گيري:

شايد تا كنون دريافته ايد كه هر يك از روش هاي ارايه شده بسته به كاربرد برنامه مي توانند در جاي خود بهترين باشند.
در مواردي كه مي دانيم اكثر تصاويري كه نياز به بررسي آن ها داريم با يكديگر تفاوت بسيار دارند، روش اول شايد بهتر گزينه باشد زيرا در حالي كه روش دوم وقت نسبتا" زيادي را صرف Hashing مي كند و روش آخر مقدار قابل توجهي از فضاي رم را با مموري استريم هاي خود اشغال مي كند، روش اول با احتمال زياد در همان پيكسل ها ابتدايي نتيجه را بسيار سريع مشخص مي كند.

روش آخر در حالت كلي خيلي سريع تر از ساير روش هاي مطرح شده عمل مي كند ولي زماني كه نياز به مقايسه ي تعداد زيادي عكس با هم داريم به دليل بارگذاري تمامي آن ها در حافظه، بخش زيادي از رم اشغال مي شود. اين در حالي است كه روش دوم پس از بارگذاري هر عكس يك اثر انگشت به آن اختصاص داده مي دهد و ديگر نيازي نيست كه آن عكس در حافظه مقيم باشد. در اين صورت هر تصوير با اثر انگشت خودش شناسايي شده و در نهايت اين اثر انگشت ها كه فضاي خيلي كم تري را نسبت به تصاوير نظيرشان اشغال مي كنند، با هم مقايسه مي شوند.


دوستان مي توانند سورس VB.NET تمام روش هاي مورد بحث را از فايل پيوست دريافت نمايند.

ravegoat
12-09-11, 19:30
اجازه دهيد منطقي را كه در اول به آن اشاره شد، دوباره بيان كنم:
دو تصوير زماني مشابه اند كه اندازه ي آن ها (پهنا و ارتفاع) با هم برابر بوده و رنگ تمامي پيكسل هاي آن دو نظير به نظير با هم برابر باشد.

آيا از ديد اين منطق دو تصوير مشابه كه يكي نسبت به ديگري دوران داده شده، با هم مطابقت مي كنند؟
آيا اين منطق دو تصوير يكسان را كه يكي از آن ها داراي درخشندگي كم تري است، مشابه هم مي داند؟
آيا منطق اشاره شده براي مقايسه ي تصاوير داراي نويز كاربرد دارد؟
بياييد پا را اندكي فراتر بگذاريم و بگوييم آيا در رايانه هاي جاسوسي كه عكس يه فرد خلافكار را با تعداد زيادي از تصوير اشخاص در حجم گسترده اي از داده ها مانند فيلم هاي امنيتي ايستگاه هاي مترو مقايسه مي كنند، از چنين الگوريتمي مي توان استفاده كرد؟
پاسخ اين پرسش و ساير پرسش هاي مشابه خير است.

اين منطق براي مقايسه ي تصاويري كه در وضعيت ايده آل نيستند، نيازمند بازنگري است. در منطق منعطف تر براي يافتن تصاوير مشابه ما بايد الگو هايي را بين دو تصوير بيابيم كه بيش ترين شباهت را با يكديگر دارند. طبيعتا" اين منطق همواره به پاسخ صحيح نمي رسد.
در چنين روشي بايد نويز تصاوير را با الگوريتم هاي مختلف كاهش داد. در مقايسه ي پيكسل ها، كد رنگ دو پيكسل الزما" نبايد دقيقا" مشابه باشد بلكه نزديك بودن كد رنگ ها نيز كفايت مي كند. محدوده ي اين نزديك بودن نيز بسته به نوع كاربرد متفاوت است.
پي مي بريم كه با اعمال چندين پردازش تصوير مختلف، با فرآيند طولاني تري رو به رو هستيم. به همين دليل در برخي موارد مي توان حوزه هايي از تصاوير مختلف (نه كل بخش هاي يك تصوير) را به صورت تصادفي براي مقايسه انتخاب كرد.

فرض كنيم دو تصوير را براي مقايسه در اختيار چندين نفر قرار دهيم. مسلما" نبايد انتظار داشت كه پاسخ تمام اين افراد يكي باشد. جالب آن است كه پاسخ انسان ها فازي است. مثلا" يكي از اين افراد مي گويد " دو تصوير تقريبا" با هم مشابه اند " يا " دو عكس مشابهت چنداني با هم ندارد ". يعني پاسخ انسان مي تواند صفر (عدم تطابق)، يك (تطابق كامل) و هر مقدار بين صفر و يك باشد. در واقع پاسخ انسان بر خلاف ماشين دقيق نيست.
با پيدايش منطق فازي (Fuzzy Logic) اين امكان فراهم شد كه رايانه نيز مانند انسان تصميم گيري كند. در يك سيستم فازي متغير هاي دقيق (Crisp Variable) تبديل به ست هاي فازي مي شوند و قوانين فازي روي اين ست ها اعمال مي شود و درنهايت طي فرآيند Defuzzification، پاسخ هاي فازي مجددا" به پاسخ دقيق كه براي ماشين قابل فهم است تبديل مي شوند. بدين شكل مي توان قوانين فازي را كه اساس تصميم گيري يك سيستم هوشمند است، روي داده هاي قابل فهم براي يك ماشين اعمال كرد.

يك روش جالب براي مقايسه ي تصاوير استفاده از شبكه ي عصبي است. ما بايد شبكه ي عصبي مصنوعي (ANN) خود را ابتدا با چند تصوير نمونه آموزش دهيم. فرضا" عكس هاي مختلف از يك شخص را به همراه عكس هاي اشخاص ديگر وارد شبكه كنيم و به شبكه بگوييم كه اين ها تصاوير شخص X هستند و آن ها تصاوير شخص X نيستند. طي اين فرآيند شبكه ي عصبي خواهد چهره ي شخص X را فرا مي گيرد. آن گاه بسته به كيفيت يادگيري شبكه مي تواند در مورد هر تصويري اظهار نظر كند و بگويد هر تصوير چقدر با تصوير شخص مورد نظر شباهت دارد. اين شبكه ي عصبي مي تواند فازي فكر كند زيرا قادر است كه شباهت دو تصوير را با عددي بين صفر و يك بيان نمايد.
ما با در نظر گرفتن يك Threshold مي توانيم شباهت تصاوير را تعيين كنيم. به عنوان مثال با در نظر گرفتن مقدار 0.7 براي threshold، دو تصوير زماني مشابه هم هستند كه شبكه ي عصبي مذكور شباهت دو تصوير را بالاي 0.7 تشخيص دهد. اگر شبكه مقداري كم تر را از 0.7 را در خروجي نمايش دهد آن گاه دو تصوير متفاوت اند. انتخاب threshold بستگي به كاربرد دارد.

و اين مقدمه اي بود بر كاربرد هوش مصنوعي (AI) در مقايسه ي تصاوير.