Image Processing with Unsafe Code - سي شارب - مقـــالات - Top Coder
Welcome to our Site
الدخــول Or تسجـــيل
الثلاثاء
2016-12-06
1:10 PM
تسجــــيل | دخـــول
الرئيسية » مقالات » سي شارب

Image Processing with Unsafe Code
Image Processing by Unsafe Code

مقـــدمه
اليوم سنتحدث عن جزئيه هامه جداً في موضوع Image Processing , حيث انه موضوع من الموضوعات الشيقه والهامه , فمجال التعامل مع الصور ازدادت اهميته مؤخراً خصوصاً مع التطور الكبير في مجال الذكاء الصناعي , فمثلاً عملية المقارنه بين الصور للتعرف على صورة شخص معين , هي عملية في حد ذاتها تستخدم الذكاء الصناعي في المقارنه بين نقاط الصورتين موضع المقارنه , وتستخدم نسب معين للفروق بين كل نقطه وبعض العمليات الاخرى والتي كلما اردنا مقارنه دقيقه تزداد تعقيداً  , عموماً هذا ليس مجال حديثنا , فاليوم سنتكلم عن كيفية البدء في تطبيق مثل هذه العمليات على الصور بطريقه تأخذ اقصر وقت ممكن في العمل .
تكوين الصورة

تتكون الصورة من مجموعه من النقاط الملونه Pixels , مرصوصه افقياً وعرضياً , حيث كل بيكسل له لون معين وحجمه صغير جداً , وبالتالي تظهر الصوره النهائيه وكأنها كتله واحده وليست مقسمه .



والبيكسل كما قلنا مساحه صغيره جداً وتحمل لون معين , وهذا اللون تحدده 3 متغيرات اساسيه وهما الالوان الاساسيه الاحمر والاخضر والازرق RGB حيث يكون لون البيكسل مزيج من الثلاثة الوان بنسب معين من كل لون بحيث يكون في النهاية اللون المحدد فمثلاً ( 150 , 187 , 250 ) يمثلون بيانات بيكسل معين حيث الاحمر R = 150 , والاخضر G = 187 , والازرق B = 250 , وكما في الطبيعه فان كل الالوان يمكن عملها من خلال مزيج معين من الثلاثة الوان السابقه .
وكل لون من الثلاثه تتراوح بين 0 : 255 اي يكون لكل لون 256 حاله , وهو ما يعني ان توفر 16,777,216 حالة او لون لكل بيكسل - حسب نظرية الاحتمالات 256 X 256 X 256 - وبالتالي فهو عدد كبير جداً من الحالات التي يمكن ان يكون عليها البيكسل
وتتكون الصورة عندما يوضع كل بيكسل بقيمته في مكانه في الصورة , والتي كما قلنا تتكون من صفوف واعمده كأنها جدول من البيكسلز

و هناك معامل اخر Alpha والذي يعبر عن شفافية البيكسل , ويأخذ ايضاً قيمة تتراوح بين 0 : 255 , حيث عند الحالة 0 يكون البيكسل غير ظاهر نهائياً وكأنه ليس موجوداً , وفي الحالة 255 يكون في اتم الوضوح , وهنا نجد ان احتماليات الالوان للبيكسل قد زادره مره اخرى الى 4,294,967,296 وهو رقم كبير جدااا
كيفية التعامل مع الصورة
عندما نتعامل مع الصورة فاننا في الاساس نتعامل مع مصفوفه من النقاط (Pixels) افقيه ورأسيه , حيث اذا اردنا مثلا رسم خط ازرق بطول 20 بيكسل , فاننا نقوم ببساطه بوضع قيم 20 بيكسل متتاليه باللون الازرق وقيمته (0,0,255) , وهذا ابسط الاجراءات التي يمكن اجراءها على الصورة , ونقيس على ذلك كل الاجراءات من تلوين خطوط افقيه ورأسيه ومربعات ودوائر , الى ان نصل الى رسم او عرض صوره كامله , فعرض صورة معينه مخزنه على الحاسب يتم بنفس الطريقه , حيث يتم قراءة قيم النقاط في الصورة , ومن ثم وضع كل قيمة في مكانها , وبالتالي تظهر الصورة كما نراها .

وبرمجياً عندما نريد وضع قيمة بيكسل او نقطه معينه في الصورة فاننا نستخدم الكلاس Bitmap حيث به داله SetPixel(x,y,color) حيث x هي المكان الافقي للبيكسل و y هو المكان الرأسي , و color هو قيمة البيكسل , فمثلاً لو لدينا صورة عرضها 150 بيكسل طولها 200 بيكسل , ونريد وضع قيمة البيسكل (145,180) باللون الاحمر فنحن ننفذ الكود التالي
b.SetPixel(145, 180, Color.FromArgb(255, 0, 0));

حيث b هو كائن من النوع  Bitmap يحمل الصورة , فوضعنا قيمة x = 145 و قيمة y = 180 وقيمة البيكسل باستخدام الكلاس Color  
التعامل مع الصور يأخذ وقتاً كبيراً
كما وضحنا فيمكنك وضع قيمة اي بيكسل في المكان الذي تريد , ولكن ماذا ان اردت تلوين الصوره كلها , ولنفترض ان الصورة ابعادها 300 X 300 , معنى ذلك انك تتعامل مع صورة تحتوي على 90000 بيكسل , نعم باستطاعتك تلوينها باي الالوان شئت باستخدام loop , ولكن كم من الوقت تأخذ هذه العمليه , ليس اقل من 700 ملي ثانيه , وهو وقت كبير بالقياس بحجم الصورة الصغير , فما بالك بصورة ابعادها 1600 X 1200 , وهو ما يعني تعاملنا مع 1,920,000 بيكسل مختلف , كم من الوقت تأخذ عملية تلوينها ؟؟ , ليس اقل من 15 ثانيه !! , وهو وقت كبير جداً , وسأعطي مثالا على ذلك بتحويل الصورة الى ابيض واسود , حيث الدالة التاليه تحول الصورة الى صورة ابيض واسود
ToBlackWhite_Normal method
 
حيث في الداله نستخدم معادله معينه لتحويل لون كل بيكسل الى قيمة معينه وبالتالي تظهر الصورة ابيض واسود فقط , فنقوم بجمع قيمة معاملات البيكسل الثلاثه RGB وقسمتها على 3 لتخرج لنا قيمة جديده , نعطي ال RGB نفس القيمه وهي القيمة الجديده , فيظهر البيكسل في حدود لونين فقط وهما الابيض والاسود

وفي الداله استخدمنا tow loops احداهما للتنقل بين الصفوف والاحرى للتنقل بين الاعمده داخل الصورة , وهذه الداله ترجع صورة من نوع Bitmap  والان عليك التجربه بنفسك , فقم باستخدام الداله في تحويل صوره معينه , وحساب الوقت المستنفذ في العمليه , ويمكنك ذلك من خلال الكود التالي  
Using Normal method
 
حيث نقوم باستخدام StopWatch لاحتساب الزمن المستقطع لتنفيذ الكود , والذي يقوم بأخذ الصورة من PictureBox وتحويلها ثم وضعها في نفس ال PictureBox

جرب صوراً ابعادها صغيره وكبيره لترى الفرق , وعند استخدامي صورة ابعادها 1600 X 1200 كان الوقت المستقطع اكثر من 16000 ملي ثانيه , اي 16 ثانيه , وهو وقت كبير جداً , فتخيل انك تطور برنامج يتعامل مع الصور , فكم من الوقت سيضيع المستخدم لتنفيذ تغيير بسيط على الصورة

ولكن هناك حل يوفر 90% من الوقت !! , نعم 90% فالصورة السابقه لن يتعدى تنفيذها 1.5 ثانيه على الاكثر
الحل هو في استخدام unsafe code , وهو ميزه وضعتها ميكروسوفت في لغة السي شارب ليتمكن المبرمجين من وضع اكواد تتعامل مع الذاكره مباشرة , ولكن كما يظهر من الاسم , فهو غير امن , حيث التعامل مباشرة مع الذاكره خطر لمن لا يدرك معنى ما يفعله

والان لدينا مكتبه بها كلاس يمكنه التعامل مع الصور من خلال unsafe code , ولتحميل المكتبه من الرابط
http://topcoder.ucoz.com/load/5-1-0-24
وقد وضعت الكود كاملاً في ملف dll لتسهيل التعامل معه , واذا اردتم الكود الكامل للمكتبه dll يمكنني رفعه على الموقع


والان يمكننا تنفيذ الداله السابقه من خلال الكلاس ImageProcess , والذي يسهل ويسرع من عملية التعامل مع الصور , حيث به نفس الدوال السابقه GetPixel و  SetPixel , والداله التاليه تقوم بنفس مهمة الدالة ToBlackWhite_Normal ولكن من خلال unsafe code
ToBlackWhite_Unsafe Method
 
والكود هو نفس الكود الداله السابقه لكن مع اختلاف بسيط , وهو وضع الصوره في ImageProcess وجعله هو من يتعامل معها , ويمكنك الان استخدام الداله واحتساب الوقت , استخدم الكود التالي
Using Unsafe Method
 
عند احتساب الوقت ستجد انخفاضاً كبيراً يتراوح بين 80% و 95% من الوقت في الداله السايقه , فعند استخدامها مع صوره ابعادها 1600 X 1200 كان الوقت المستقطع حوال 1600 ملي ثانيه , اي 1.6 ثانيه , وقس على ذلك في التعامل مع الصور الاخرى , فالصورة ذات الابعاد 300 X 300 لم يتعدى الوقت المستقطع ال 90 ملي ثانيه , اي ما يعادل 0.09 ثانيه , وهو وقت صغير جدا بالمقارنه بالحاله السابقه اكثر من 700 ملي ثانيه
ختـــــام
في المقاله قمنا بشرح سريع عن كيفية التعامل مع الصور من خلال الكلاس ImageProcess والذي يعتمد في الاساس على unsafe code , ولنعتبرها خطوة اولى في البدء في مجال Image Processing  
تحميل المشروع
 Written by :  Mohammed Mahmoud
الفئة: سي شارب | أضاف: ham_mody2000 (2011-08-27 5:24 PM)
مشاهده: 2625 | تعليقات: 2 | الترتيب: 0.0/0


أترك تعليقك من خلال حسابك على الفيس بوك

تعليقات مشتركي الموقع

مجموع المقالات: 1
1  
شكرا لك و حبذا لو ترفع كود المكتبة كما قلت
أسأل الله لك التوفيق

إضافة تعليق يستطيع فقط المستخدمون المسجلون
[ التسجيل | دخول ]
طريقة الدخول
بحث
Our Facebook community

تم إطلاق صفحة توب كودر على الفيس بوك

Advertisment
الأحـــدث
hitstatus
Copyright Mohammed Mahmoud © 2016
إنشاء موقع مجاني с uCoz