Representation_II_(Descriptors)_-_Image_Processing_(Lecture_7_-_B)
السلام عليكم ورحمة الله وبركاته، ازيكم يا شباب عاملين إيه؟ هنكمل دلوقتي إن شاء الله المحاضرة رقم 7. المرة اللي فاتت اتكلمنا عن الـ feature extraction، دلوقتي هنتكلم بقى عن الـ descriptors إزاي بنقدر نوصف الـ features اللي احنا أو الأشكال اللي عندنا اللي إحنا استخرجناها. أول طريقة عندنا نقدر نوصف بيها الأشكال بنسميها الـ chain code. الـ chain code دي عبارة عن إيه؟ عبارة عن إن أنا بكون عندي شوية points زي اللي تحت على اليمين دي عندنا كدا
وبنوصفها بحاجة اسمها الـ Freeman chain code. عندنا طريقتين، يا إما بنستعمل الـ 4-connectivity يا إما الـ 8-connectivity اللي هما الشكلين اللي تحت اللي عندنا دول. إيه اللي بيحصل؟ إن أنا باجي أقوم واقف عند أكتر نقطة فوق و على الشمال، اللي هي النقطة اللي هو مشاور عليها هنا دي، أعلى نقطة وأكتر نقطة على الشمال تمام، وبفضل ماشي من بعدها، بتحرك يمين وأبتدي أشوف أنا مشيت في أنهي direction وأكتب الرقم بتاعه، يعني إيه؟ يعني لو أنا هشتغل 4-connectivity اللي هو الشكل ده
أو الـ 8 دي بالشكل ده. تعال نمسك الـ 4 الأول، هشوف إن أنا واقف عند الـ point اللي هي دي، صح؟ طب اللي بعدها دي على يمينها، اليمين ده بيساوي 0، أقوم كاتب ايه؟ 0، بعدين يمين تاني، 0، 0، وهفضل كدا 0، 0، 0، 0، 0، 0 لحد ما أوصل للحتة دي. لو أنا شغال 4 أنا عندي أهي point أهي وهنا فاضية وهنا فاضية وبعدين عندي point هنا اهو. يا إما أقول إن أنا نزلت ودخلت يمين، يا إما أقول إن أنا دخلت يمين وبعدين نزلت، صح؟
فهتلاقي إن أنا يا إما قولتله 0 3 اللي هو يمين وتحت، تحت ده بـ 3، يا إما 3 0 تحت ويمين. الإثنين يمشوا صح. لو أنا شغال 8، الـ 8-connectivity، ألاقي إن أنا أصلًا عندي ده اتجاه من ضمن الاتجاهات اللي هو بيساوي كام؟ بيساوي 7، هتلاقيه كاتب هنا 7. بعدين راح نزل لتحت، فتلاقي إن هو التحت اللي هنا بيساوي 3.
فتلاقي عملها 3 3 3، أو لو أنا في الـ 8 هلاقي إن هو إيه 6 فيبقى 6 6 6 لحد اخر الشكل بتاعي. طيب إيه مشكلة حاجة زي كدا؟ المشكلة إن هي بتكون طويلة جداً لو أنا فضلت ماشي بالشكل ده بالظبط كدا، هلاقي إن أنا في الآخر عندي رقم كبير جداً. حاجة تانية إن هي بتـ depend على الـ starting point، لو أنا كنت بدأت مثلاً عند الـ point اللي هو مشاور عليها هنا دي هيطلعلي code مختلف. فإزاي بقى نقدر نحل الحاجات دي؟
أول حاجة إن أنا بعملها resampling، يعني إيه resampling؟ إن أنا بدل ما أنا عندي points كتيرة جداً وفي حاجات فيها متكررة، بمشي مثلاً يمين كتير قوي وبعدين تحت كتير قوي، طب ما أنا ممكن أقلل ده أصلاً وأخد عدد points أقل، فأول حاجة إن أنا بعمل resample بحيث إن أنا أخد ايه؟ points أقل، بعمل resample على grid أكبر، فأشوف إن انا شوية الـ points اللي عندي دول كلهم أقدر أطلعهم آدي point
آدي التانية، وعندي هنا point قريبة من هنا فآدي آخد دي كدا اهو، وهكذا. بفضل أعمل resample على grid أكبر شوية. طبعاً ده بيقلل الـ accuracy شوية، يعني أنا هنا كان عندي تفاصيل كتير جداً هنا في الشكل ده مثلاً في الجنب ده، كلها راحت، بقى عندي خطين بس، بس دوت بيبقى على حسب بقى أنا عايز الـ accuracy ولا عايز الـ memory، عايز أخزن قد إيه. فآدي مثال لو أنا عندي شكل زي ده كدا.
بعمل دول resampling بحيث إن أنا أخد عدد points أقل، وبعدين في الآخر لو أنا هشتغل على الـ 4-connectivity هيطلعلي الشكل ده، لو هشتغل على الـ 8-connectivity هيبقى شكل smooth أكتر، مش هيبقى ماشي فيه الـ zigzag ده كدا. ده هو example كامل خالص، مثلاً صورة من تحت الـ microscope ولا حاجة، فانا باخد الصورة كدا، وبعدين بعملها blurring أو smoothing بـ 9 في 9 average mask
وبعدين عملتلها هنا threshold بالـ Otsu method اللي إحنا كنا خدناها قبل كدا، وهنا دي الـ boundary بتاعتي تمام، وبعدين بعملها subsampling، بآخد points كتيرة على الـ boundary بتاع الشكل بتاعي، وهنا في الآخر بعد ما وصلتهم ببعض. طيب إحنا كدا حلينا مشكلة إن هو بيكون عندي رقم طويل. بقية المشاكل، ببدأ منين؟ طب لو لفيت الشكل طب لو كبرت وصغرت وكدا حلها بيتعمل في الـ slide
دي، إن أنا بـ normalize الـ starting point إزاي؟ بشوف أنا الـ chain code بتاعي عامل إزاي، طلع إزاي في الآخر، وبعمله circulation، يعني إيه circulation؟ يعني أنا مثلاً طلعلي 1 2 3 3 2، هي هي لو أنا خدت الـ 2 دي حطيتها في الأول، صح؟ لأن أنا في الأول وفي الآخر الشكل عندي بيكون قافل ببعضه. فأنا لو بادئ من هنا هلاقي مثلاً إن أنا مشيت يمين فآدي 0 وبعدين نزلت آدي 3.
لو أنا كنت بادئ من هنا هلاقي إن أنا عندي 3 نزلت على طول وآخر حاجة خالص عندي هلاقيها الـ 0 فاقدر أجيبها في الأول عادي مش هتقولي لأ يعني فإنا بـ circulate لحد ما ألاقي إن أنا في الآخر عندي أصغر magnitude أقدر أحسبه يعني أنا لو في المثال ده إحنا بالفعل واقف عند أصغر magnitude لكن أنا لو كان طالعلي 3 3 2 1 2
كنت هفضل أعمله circulation لحد ما أجيب أصغر رقم ده في الأول فبالتالي يطلعلي ده كدا ده كدا بنسميه smallest integer أو smallest magnitude تمام؟ طيب لو عايز أـ normalizeـه بالنسبة للـ scaling عايز أكبره أو أصغره فأنا بـ resize sampling grid لو أنا لقيت الشكل عندي كبير أوي فهتفق إن أنا دايمًا هعمله sampling فـ مثلاً 3 في 8 grid فسواء بقى هو كبير أو صغير أو أياً كان هعمله sampling على 3 في 8 دي فـ
بالتالي إنا هـ force عدد معين من النقط اللي يقدر يمشي عليها. طب الـ rotation بقى نعملها إزاي؟ إن أنا لو كان الشكل كدا هوت زي اللي إحنا قلنا عليه دوت لو أنا لفيته مثلاً شوية هلاقي إن أنا بدل ما أنا مشيت كدا كدا هلاقي مشيت كدا وكدا فبالتالي أرقام تانية خالص فقالك بنستخدم حاجة بقى اسمها الـ difference of code يعني إيه difference of code؟ يعني بشوف هو أنا عشان أنتقل
من الـ point دي للـ point اللي بعدها محتاج كام خطوة؟فمثلاً لو انا ده الكود اللي عندي اهو. هو أنا لو أنا واقف على الـ 1 وعاوز أروح للـ 0 محتاج كام خطوة؟ هلاقي إن أنا الفرق ما بين الـ 1 والـ 0 خطوة واحدة صح؟ لأ ليه؟ لأن أنا ده اتجاه اللف بتاعي فبالتالي أنا لو واقف عند الـ 1 وعايز أروح للـ 0 هحسب آدي 1
2 3 هقوم نازل كاتب الـ 3 دي. طب أنا عند الـ 0 وعايز أروح للـ 1 هلاقي إن أنا خطوة واحدة أهو هقوم كاتب 1. بعدين عند الـ 1 وعايز أروح للـ 0 3 تاني. عند الـ 0 وعاوز أروح للـ 3 لو أنا عند الـ 0 أهو هنجيب لون تاني عاوز أروح للـ 3 آدي 1 2 3 أقوم نازل كاتب الـ 3 وهكذا.
فبالتالي لو أنا بقى لفيت الشكل بتاعي يعني مثلاً لو أنا عندي 1 0 أهي 1 0 وبعد ما لفيتها شوية كدا بقت عاملة بالشكل ده اللي هو بقى 0 3 لما أجي أحسب الـ difference code بتاعهم هلاقي من الـ 1 للـ 0 بـ 3 وبعدين من الـ 0 لـ 3 هلاقيها بـ 3 بردو فبالتالي الـ difference code دوت بيتم المحافظة عليه مهما لفيت الشكل.
فبالتالي بقينا بنستعمل الـ difference code بدل الكود نفسه وبردو علشان أـ normalizeـه من ناحية الـ starting point بعد ما أجيب الـ difference بروح جايبله الـ minimum magnitude بتاعه اللي هو مثلاً هقوم جايب الـ 0 دوت في الأول أو الـ 0 ده في الأول ونشوف بقى أنهي 0 فيهم هو اللي بيديني أكبر أو أصغر magnitude وأكمل بيه. فعرفنا إزاي بنجيب
الـ code نفسه بتاع الشكل اللي هو الـ chain code وبعدين بنجيب الـ difference ما بين كل اتنين ورا بعض عشان نـ normalizeـه للـ rotation. هنا بس بيديلي معلومة صغيرة إن أنا لما بوصل للآخر خالص عندي اللي هو الـ 2 مش بقف لأ إحنا اتفقنا إن هو circulating فبشوف الـ 2 دي اللي بعدها كام بعدها 0 فالفرق ما بين الـ 2 والـ 0 لو أنا هنا في الـ 8 direction
فأنا واقف عند الـ 2 عاوز أروح للـ 0 هلاقي إن أنا الفرق بتاعي 6 فبروح كاتب الـ 6 دي بس بأخدها بحطها في الأول. بس يعني طبعاً مش في الـ 0 بحطها قبل الـ 0 فبالتالي بتبقى 6 أهي وبعدين تلت أصفار تلت أصفار وبكمل الـ code بتاعي عادي بس بيقولك يعني إن آخر رقم خالص بطرحه من أول رقم خالص وبجيبهم أحطهم في الأول ده العرف بتاع الـ code
عشان بس لو جالك مثلاً مثال أنت شايف إن هو فيه 0 0 0 ورا بعض لقيت الـ code مثلاً فيه 3، 3 إزاي؟ أنا أصلاً ماشي بنفس الرقم فالمفروض منتظر 0 0 0 فلا ده معناه إن دوت آخر رقم طرحته من أول رقم وجبته في الأول فمتستغربش يعني بس إيه الرقم الغريب اللي في الأول. دي شوية examples كدا من اللي عندنا تعالوا ناخد حاجة معقدة شوية زي ده مثلاً هلاقي إن أنا ببدأ دايمًا من فوق على الشمال وبمشي كدا هو تمام.
فأنا مشيت كدا بقت ايه؟ أدي 0، نزلت أدي 3، يمين أدي 0، نزلت 3، بعد كدا مرتين للشمال 2 ومرتين لفوق أدي 1. لما أجي أعمل الـ difference هو هنا عامل بقى اللي احنا لسه قايلك عليك إن هو بيجيب الأخير minus أولاني ويحطهم في الأول، فيا إما نبدأ بيها يا إما نعمل زي ما أنا هعمل كدا، أهه هقوله مثلاً من 0 لـ 3 صح؟ اهه
أدي من 0 لـ 3 بـ 3، هسيب مسافة وأحط الـ 3 بتاعتي هنا اهه. من الـ 3 للـ 0 أدي واحدة، ومن 0 لـ 3 بـ 3، 3 للـ 2 بـ 3 وهفضل مكمل مكمل لغاية اما أوصل في الآخر إن انا الفرق ما بين الـ 1 والـ 1 بـ 0، آخد بقى الـ 1 minus الـ 0 اللي هي بـ 3 أقوم رايح حاطط الـ 3 دي في الأول تمام؟
بعد ما جبت الـ difference بتاعي، بروح أعمله smallest integer إن أنا أجيب الأصفار دي في الأول أفضل أـ circulate كدا أو أـ shiftـوا لغاية ما أجيب أصغر رقم أقدر عليه، الأصغر رقم خالص ده بنسميه حاجة اسمها الـ shape number، ده المفروض إن هو بيكون unique لكل شكل، الشكل اللي هو دوت مثلاً غير الشكل ده غير الشكل ده، كل واحد فيهم هتلاقي الـ shape number بتاعه مختلف عن التاني
فهتلاقيه أهه بيقولك إن ده الـ shape number هو الـ بجيب الـ difference وبجيبله الـ smallest magnitude للـ chain code فبالتالي بيبقى دوت الـ shape number وعلى حسب هما كام digit ده بنسميه order n، يعني ده مثلاً هتلاقي إن هو 8، 4 و4 يبقى ده كدا of order 8 اللي هو الـ shape ده. ممكن يقوم جاييبلي مثلاً في الامتحان شكل زي الشكل دوت ويقولي عايز الـ shape number of order 18
18 يعني أنت عاوز 18 digits، فـ 18 دوت ممكن مثلاً يحطه على grid كام في كام؟ 3 في 6، فهقوم أنا جاي كدة مقسمه أهوت أدي 3 وأدي الـ 6، وأعمله subsampling أدي 1، 2، 3، 4، 5 أعمله بقى subsampling على الـ grid دي، وبعدين أبتدي من الـ upper leftmost وأفضل بقى مكمل وأحسب بعدها الـ difference وبعدين أحسب بعدها الـ shape number
فبالتالي في الآخر أوصل للايه؟ للمطلوب اللي هو طالبه مني. لو عايزين نـ sum up الموضوع بتاع الـ shape number ده كله، نقول إن هو لو أنا عندي في high dimensions الدنيا كبيرة جداً بعمل reduction في الـ data عن طريق إن أنا بعمله ايه؟ subsampling. بردو بيقول لي إن هو sensitive للـ noise، فهلاقي إن أنا لو الشكل بتاعي مثلاً مش منتظم، لو هو كدا وكان فيه noise حاجة طالعة منه كدا وبعدين مكمل، فلما أجي بقى أعمله sampling والـ shape number وكدا فبالتالي
هياخد باله من الحاجة دي يعني مش هتطير معاه في السكة، فبالتالي هو بيكون sensitive للـ noise اللي عنده. بيقولي بردو إن دي طريقة unified أقدر أـ analyze بيها الـ boundary بتاع الـ shape، الـ outline بتاع الـ shape أقدر أوصفه بطريقة unique، فأياً كان الشكل ده عبارة عن إيه، وإن أنا في الآخر بقدر أعمل recovery للشكل بتاعي عن طريق ايه؟ الـ code... اللي هو الـ shape code.
عندي حاجة كمان غير الـ chain code بنسميها الـ signature. signature دي عبارة عن إن أنا بدل ما أنا عندي الـ boundary في شكل 2D بوصفها في شكل 1D. جوا الـ signature دي بقى فيه كذا حاجة بنجابها ممكن تعملها على الـ centroid distance، الـ slope density، الـ cumulative angle، الـ curvature، الـ area كذا حاجة، بس إحنا هنا هنتكلم على الـ centroid distance بس
تمام؟ يعني إيه centroid distance؟ أنت بتيجي في نص الشكل بالظبط وتقوم واقف هنا كدا، تمد خط مستقيم ناحية اليمين، وبتفضل تلف لحد ما تكمل 360 درجة كلهم وتحسب المسافة ما بينك وما بين الخط اللي أنت خبطت فيه. فبالتالي إن أنا هلاقي إن انا الـ signature في الـ دايرة بتكون خط مستقيم إن هي كلها نفس المسافة، أما في المربع هلاقي إن أنا لما بوصل للـ corners
دي أكبر magnitude عندي، لانها أطول قيمة عندي، وبعدين تصغر تاني، وبعدين تزيد، وبعدين تصغر تاني، وبعدين تزيد عند الـ corner وبعدين تصغر تاني، وبعدين تزيد، فبالتالي هلاقي إن أنا عندي peaks في الـ signal بتاعتي بعدد الـ corners اللي عندي، أنا عندي أربعة corners في الـ square، فبالتالي هلاقي عندي أربعة peaks، 1، 2، 3، 4. هنا مثلاً هلاقي إن أنا عندي مثلث أهوت هاجي أقف هنا وأمشي فهلاقي إن أطول حاجة أطول حاجة أطول حاجة فبالتالي عندي
عندي تلاتة peaks وفي مربع زي ما قلنا هيبقوا أربعة peaks طبعاً ده مش مربع منتظم فبتلاقي مآ هياش perfect زي اللي فاتت بس بردو واضح إن أنا عندي أربعة peaks في الشكل بتاعي. نقدر نستعمل حاجة زي كدا في إيه لو أنا مثلاً بعمل sign language أو عايز أعرف الإيد دي مثلاً الصورة اللي عندي دي فيها كام صباع في الإيد فبالتالي هقوم جايب بعد ما عملت خلاص segmentation وكل حاجة و thresholding وعملت extraction للإيد نفسها باجي أقوم واقف في النص وأحسب المسافات فبالتالي بردو
بردو أبعد مسافة هتبقى دي مسافة آخر الصباع صح كدا؟ فبالتالي عدد الـ peaks اللي هتطلعلي عندي في الـ curve سيبك من النقط اللي هو راسمها دي عدد الـ peaks دي يقولي عدد الصوابع اللي ايه؟ اللي موجودة لو أنا مثلاً هو كان فاتح صباعين بس مكنش هيبقى فيه الـ peak دي ولا دي ولا دي كان هيبقى عندي الشكل عامل كدا اهه صباع ده لـ جوه وده لـ جوه وده كدا صح؟ فبالتالي لما أجي أحسب الـ peaks هلاقي إن أنا أو أحسب الـ signature هلاقي عندي اتنين peaks بس اللي هما الاتنين دول فبالتالي عدد الـ peaks بيساوي عدد الصوابع اللي هي إيه المرفوعة عندي في الصورة
طيب إزاي أقدر أـ normalize الـ signature دي على حسب بردو الـ rotation والـ scaling لأن أنا ممكن لو كبرت الشكل بتاعي بدل ما كنت قايس مثلاً في الإيد تمام كنت قايس المسافة هنا مثلاً دي مثلاً بـ تلاتة لو أنا عندي بقى إيد أكبر هاجي أقيسها هلاقي إنها بقت بـ ستة فإزاي أـ normalize ـها طبيعي جداً إن أنا بقوم إيه عامل normalization عادي جداً إن أنا بخلي الـ range بتاعي ما بين الـ 0 للـ
1 واقسمه على الـ maximum والـ equation بتاعت الـ normalizing فأنا كدا أبقلى عملتله normalize على الـ scaling. طيب ماذا عن الـ rotation؟ الـ rotation فكرته في إن أنا لو الشكل عندي كدا هوت طب لو أنا جيت لفيته وجيت بدأت بردو في النص ومشيت كدا وبدأت ألف هلاقي إن الموضوع عندي إيه مش- مطلعلي signal تانية خالص فاستقروا في الآخر
أسهل حاجة إن أنا يعني ايه هبدأ عند أكتر نقطة بعيدة عن الـ centroid، يعني أنا هقف عند الـ centroid أهوت وألف لفة بسرعة أشوف إيه أبعد نقطة عندي عن الـ centroid أبدأ منها say مثلاً هي النقطة دي أروح بادئ منها وألف اللفة بتاعتي كلها. فبالتالي لو أنا كنت واقف هنا هلاقي نفس النقطة دي هي أبعد حاجة هبتدي من عندها وألف لفة كاملة بالتالي المهم إن أنا في الآخر يطلعلي نفس الـ signal بالظبط نفس الشكل.
طلعلي مثلاً والله الشكل هنا عامل كدا مثلاً فبالتالي يبقى يطلعلي في دي بردو نفس الفكرة. مينفعش دي متـ shift شوية كدا ولا كدا عشان إيه في الآخر أعرف أقارن الـ two signals أو الـ two functions دول عندي زي بعض بالظبط. فبردو عشان خلاصة الموضوع إن هو usually بيكون normalized عشان يبقى translation و scale invariant مهما حركته ومهما لفيته ومهما عملتله scaling كدا
بيقول إن هو بيبقى عنده high matching cost عشان أقدر أـ match ما بين اتنين signals مع بعض الموضوع بيكون الموضوع بيكلفني وقت كبير وبردو زي اللي قبلها بيكون sensitive للـ noise. عندي شوية descriptors تانيين بردو بيندرجوا تحت مسمى الـ polygon approximation حاجة من ضمنهم اللي هي الـ minimum perimeter polygons إن أنا بحاول أـ approximate الـ polygon بتاعي من اسمها كدا الـ polygon approximation بدل ما هو مليان
curvatures وأشكال غريبة كدا هوj لأ أنا بشوف بعمله بردو زي subsampling على grid وبعدين أشوف هو معدي بأنهي pixels من على الـ grid بتاعي وبعدين أقوم موصل الشكل اللي يديني أقل perimeter للشكل الخارجي بتاعي ده. فهتلاقي هنا إن هو بيجي أهوه يشوف هو عدى بأنهي pixels وبعدين يحط points بتاعته على الـ outline بتاعها ويشوف الـ points اللي داخلة لـ جوه اللي هي السوداء دي، أي point داخلة لـ جوه بيقوم مطلعها مسافة لـ بره فتلاقي مثلاً هو خد الـ point دي خرجت لـ بره شوية والـ point دي خرجها لـ بره شوية ودي يقوم
مخرجها بره شوية. بيقوم مقرب كل point من السود دول لـ بره شوية عشان إيه يحاول يقلل الـ perimeter يعني فبالتالي بيقوم جايب إيه الـ minimum perimeter polygon. طبعاً بيلفت نظري بردو إن دي بتعتمد على عدد الـ points اللي أنا خدتها يعني أنا هنا خدت points على الزوايا بس كان ممكن أخد points أكتر. فهنا نفس الكلام إن هو لو أنا خدت points كتيرة بيطلعلي شكل مطابق أوي للي هو الشكل اللي كان عندي أصلاً وكل ما بقعد أصغر الـ points كل ما الشكل بيشوه شوية بس بيفضل محافظ بردو على الـ outline بتاعه يعني شكلها ورقة شجر بردو شوية طبعاً
لحد ما نصغّر العدد جداً فما يبقاش واضح لي إيه الشكل اللي قدامي ده. عندي حاجة كمان اسمها الـ boundary segments إن أنا بدل ما أنا بعرّف الشكل بتاعي عن طريق الـ outline بتاعه كله بقسمه حتت صغيرة وأقول إن هو عبارة عن الحتت دي، يعني إيه؟ أنا بقوم جايب كدا زي شكل زي ده بقوم محاوطه بشكل تاني اللي هو الرمادي اللي حواليه دوت واشوف ببدا من أي نقطة
نقطة ونشوف لو أنا الشكل بتاعي هيخش جوه الرمادي دوت بروح حاطط خط يعني إيه يعني أنا مثلاً قلنا هبدأ من هنا ماشي أنا ماشي على الـ outline بتاعي أهوه جيت هيخش جوه وأروح حاطط خط، أنا لسه جوه جوه جوه أول ما ألاقيها هيخرج ويلمس الخط أقوم حاطط خط مكمل على الـ boundary كلها هيخش تاني أهه أقوم حاطط خط وأفضل مكمل لمس الـ outline بتاعي يروح حاطط هنا وبعدين دخل تاني هنا
وهلاقي نفس الكلام فبالتالي في الآخر بقى عندي أدي curve، اتنين، تلاتة، أربعة، خمسة، ستة، سبعة، تمانية، فالشكل ده أقدر أقول إن هو عبارة عن تمانية curveـات كل curve فيهم ليه equation معينة أو ليه حاجة هـ أوصفها بطريقة معينة بقى، بس إن أنا boundary segments باخد الـ boundary وأعملها segmentation بالمعنى الحرفي بتاعها. آخر حاجة في الـ polygon approximation هي بنسميها الـ skeletonization أو الـ skeletons إن أنا بحاول أـ reduce الشكل بتاعي للـ skeleton بتاعه، للعمود الفقري بتاعه
بتاعه، فمثلاً لو عندي حاجة simple زي كدا بيقوم بيدخل من كل الـ corners ويقوم موصلهم ببعض في الآخر، وهنا نفس الكلام بس بقى عنده زاوية زيادة فطلع لها منها، وهنا لو عندي زاوية بيحصل فيها الشكل دوت، بس فكرتها كلها معتمدة على حاجة اسمها medial axis transformation بتحاول تشوف الشكل بتاعي ده عبارة عن شكله عامل إزاي وتفضل تدخله لـ جوه لحد ما إيه تجيب الـ skeleton
بتاعه. عندنا بعد كدا شوية descriptors مختلفين شوية عن اللي فاتوا، سريعاً كدا إحنا اتكلمنا عن إيه إحنا اتكلمنا على الـ chain code أول حاجة بعدين اتكلمنا على الـ signatures واتكلمنا على الـ polygon approximation والـ minimum perimeter polygon وبعدين اتكلمنا على الـ boundary segments والـ skeletons في الآخر. هندخل دلوقتي على شوية descriptors مختلفين، الـ mainly هما تلاتة categories اللي هما الـ simple descriptors والـ fourier descriptors
والـ statistical moments. الـ shape number إحنا خدناه كان تبع الـ chain code تمام. simple descriptors من اسمها هي حاجات trivial أوي أو تافهة أوي أو متوقعة يعني، الـ perimeter مثلاً نشوف الشكل دوت الـ perimeter بتاعه بيساوي كام، الـ diameter، الـ eccentricity ودي بتكون الـ ratio بتاعة أطول chord على الـ
الـ chord الـ perpendicular عليه يعني بيقوم جاي ويشوف كدا أطول خط مستقيم جوه الشكل بتاعي، وبعدين يجيب أطول خط مستقيم perpendicular عليه هو دوت ولا ده ولا ده ولا واحد هنا ويشوف أطول واحد فيهم ويقسمهم على بعض دي كدا حاجة اسمها الـ eccentricity، ترجمتها الحرفية الـ eccentricity دي هي بيضاويّة بيقيس بيضاويّة الشكل يعني إيه؟
يعني لو أنا عندي دايرة فبالتالي هقيس أقسم ده على ده هيديني في الآخر ratio بـ 1 فدي كدا مش بيضاوية لكن لو أنا قسمت أطول chord على أقل chord فبالتالي هيطلعلي رقم كبير فالشكل دوت أشبه بالبيضاوي يعني تمام. زيها عندنا الـ rectangularity إن أنا بجيب الشكل بتاعي وبعمله بحطه في box كدا هو يـ surround ـه وبعدين أحسب مساحة الصندوق دوت
ومساحة الشكل وأقسمهم على بعض فبالتالي مين اللي هيجيبلي أكبر قيمة في الـ rectangularity؟ الـ rectangles لأن هو already هيكون الشكل هو هو الـ box فهكون بقسم x مثلاً على نفس الـ x دي فيديني 1 بردو فدي كدا أكبر حاجة تديني قيمة في الـ rectangularity وأي شكل تاني بيديني قيمة أصغر وطبعاً كل ما الشكل كان أصغر أو
الـ regular أكتر ده بيديني قيمة أقل في الـ rectangularity. حاجتين كمان من ضمن الـ simple descriptors، الـ curvature، نشوف هو curveـات اللي فيه قد إيه، والـ convexity زي اللي احنا كنا لسه بنتكلم عليها من شوية اللي هو كل ما بيدخل وبيقوم بيخرج تاني اللي هو بيجيب حاجة اسمها الـ convex hull. فبيقولي بردو إن ناخد بالنا إن الحاجات دي على قد ما هي simple وسهلة إن إحنا نحسبها على قد ما هي مش بتكون مميزة جداً هي بس بنستعملها إن إحنا بنـ eliminate بيها حاجة بنسميها الـ false hits
وإلا مثلاً انا ممكن يبقى عندي دايرة ومربع باختلاف أحجامهم يدوني نفس الـ perimeter فبالتالي مش دي الحاجة اللي هتميزلي ولكن بقدر مثلاً أستخدم حاجة زي الـ perimeter لو أنا عايز أجيب الـ objects اللي حجمها الشكل الفلاني فأقول مثلاً الـ perimeter ما بين عشرة وخمسة مثلاً لكن مش عايز الحاجات الكبيرة اللي في أكتر من عشرة ولا الحاجات الصغيرة، فبالتالي بـ eliminate الحاجات دي وبعدين أستخدم بقى أي descriptor تاني يكون أعقد شوية
يفصلي بقى ما بين الدايرة والمربع والنجمة والأشكال المختلفة اللي عندي. تاني حاجة عندي هي الـ fourier descriptors، باختصار هو بيجي عند الـ boundary بتاع الشكل بتاعنا زي كدا، إحنا fourier لو فاكرين كان بيبقى عندي أرقام complex وأنا بحولها لأرقام عادية في الـ fourier series بتاعتي، فهنا هو معندوش complex number، هيعملها إزاي؟ بيـ create هو أو بيفترض إن الشكل بتاعي عبارة عن complex numbers إزاي؟ بيحول الـ x والـ y
للـ complex axis بتوعه، فتبقى دوت كدا الـ real axis ودوت الـ imaginary axis، يعني مثلاً لو أنا كان عندي point عند خمسة وأربعة تمام، اللي هي الـ point دي مثلاً، نفترض إنها عند خمسة وأربعة، الـ point دي هتقوم مطلعالي رقم اسمه 5 + 4i، أو هو هنا بيستعمل j فتبقى 5 + 4j.
فهو كدا بيعتبر إن الـ point دي عبارة عن رقم complex، وبعدين يعمل fourier عادي جداً، القانون بتاع fourier اللي هو كان negative j 2pi ku على k والـ summation على كل دوت، الرقم بقى اللي بيطلعله في الآخر دوت بيسميه الـ fourier descriptors، اللي هما كانوا الـ coefficients بتوعنا في الـ fourier في الـ signals عادية، هنا بنسميه الـ fourier descriptors، فهو بالتالي بيقدر يحول
بدل ما هو عنده الصورة بالشكل دوت يقدر يحولها لشوية fourier descriptors. ميزتها إنها تعتبر lossless، إن أنا عندي نفس الـ points حولتها بـ fourier فبقت compact أكتر شوية، بعدين لما أجي أرجعها بترجّعلي الشكل زي ما هو بالظبط. ميزتها كمان إن أنا مش شرط آخد الـ points كلها وأعبر بيها عن الشكل، ممكن آخد بعض الـ points معينة اللي بتعبرلي أكتر عن تفاصيل الشكل
ممكن آخد الحاجات اللي بتديني الـ outline بتاع الشكل بشكل vague كدا شوية وأنفض للحاجات اللي مدياني finer details اللي هي بالـ high frequencies، فبالتالي بعد ما بحوله بقدر إن أنا أختصر بيه أو أـ compress بيه الشكل شوية. فمثلاً حاجة زي كدا دي لو أنا الصورة الأصلية بتاعتي، وهنا لما عملتلها الـ fourier وبعدين inverse fourier تاني، بكل الـ points يعني.
وبعدين بقى الصور دي تباعاً هو عمال ياخد points أقل points أقل points أقل من الـ fourier descriptors بتوعه، فبالتالي إن هو بتلاقي إن هو في الآخر الموضوع بقى ايه عمال يحصل له smoothing شوية بس محافظ على الشكل بتاعه، لحد طبعاً بردو اما بنوصل لـ range قليل جداً مببقاش عارف انا إيه الشكل اللي كان قدامي ده أصلاً، بس في نفس الوقت بردو هو لسه واخد الشكل دوت بتاع الـ chromosome.
اللي كان في الأول خالص. ميزة بردو الـ fourier descriptors إن أنا الـ normalization بتاعه بيقدر يتعمل بسهولة من ناحية الـ coding أو الـ computation، إن أنا بعد ما بجيب خلاص الـ fourier descriptors بتوعي كلهم، لو أنا عايز أعمله normalization للـ rotation بروح ضربه في e power j theta، theta دي اللي هي الـ angle اللي أنا لفيت بيها، وبردو كل translation والـ scaling الكلام ده كله ليه طريقة معينة إن أنا
بضربها بس في الـ descriptors بتوعي أبقى أنا كدا عملتله normalization على طول. فتجميعا بردو للي إحنا لسه قايلينه، إن هو simple to compute وبالأخص بالـ fast fourier بقى سريع جداً دلوقتي، كل descriptor ليها specific physical meaning، كل point عندي بتساوي الـ point اللي أنا أصلاً واخدها من الصورة بتاعتي اللي أنا حولتها لـ complex number.
وسهلة إن أنا أعملها normalization زي ما إحنا لسه قايلين، مجرد بضرب قيمة في القيم اللي عندي، وإن هي بتـ capture الـ global والـ local features، الـ global اللي هي الـ outline بتاع الشكل مثلاً بطريقة معينة، الـ local features بقى اللي هي التفاصيل اللي هي الـ high frequencies اللي بتبقى عندي. وآخر حاجة من ضمن الـ boundary-based descriptors هي الـ statistical moments. الـ statistical moments من اسمها كدا هي معتمدة على شوية حاجات statistical اللي هي الـ mean والـ variance والـ standard deviation والحاجات دي.
بتوصفلي هي الشكل بتاعي. فمن غير ما نخش بردو في الـ math بتاعها أو في القوانين بتاعتها يعني، بيكون عندي نوعين من الـ moments، يا إما raw moment، الـ raw moment دي اللي بتكون حوالين الـ 0، يا إما بيكون عندي حاجة اسمها الـ central moments، دي بتكون حوالين الـ mean. بيكون عندي في كل واحدة فيها سواء الـ raw أو الـ central، first raw moment و second raw moment و third raw moment، ونفس الكلام في الـ central.
فكل رقم من دول بيعبرلي أو بيوصلني لحاجة معينة ففي الـ raw أو في الـ raw moments يعني أنا مطالب مني أعرف بس إن أول raw moment دي الـ mean اللي هو النقطة اللي في النص بتاعتي أو الـ average يعني. أما في الـ central moments بـ skip أول واحدة، second central moment دي بتكون الـ variance، الـ third central moment دي بتكون الـ skew، الـ skew ده اللي هو لو أنا عندي الشكل مايل كدا شوية
فدي بتحسب الـ skewness بتاعته فبيقول لي طبعاً إن هو لو شكل symmetric اللي هو شكل عادي symmetric حوالين البتاع كدا فبالتالي مفيش أي skewness فبيديني على طول لو أنا كان عندي أصلاً third central moment لو هي defined هتديني 0 على طول إن هو الشكل مفيش أصلاً أي skewness والرابعة حاجة اسمها الـ kurtosis. الـ kurtosis دي بتشوف الشكل هل هو طويل
ورفيع- tall and skinny ولا مبطط كدا وصغير؟ فدي ده معنى كلمة kurtosis يعني. فبردو مش مطالبين بأي حاجة من الـ math أو القوانين اللي كانت موجودة عندي دي، بس نعرف الخلاصة إن هو لو أنا عندي infinite number of central moments لو أنا جبت الـ second central moment اللي هي قلنا كانت الـ variance والـ skew والـ kurtosis الـ second والـ third والـ fourth والـ fifth وهكذا لو أنا عندي infinite فإنا كدا هقدر أوصف الشكل بتاعي
بدقة بس طبعاً مبيكونش عندي، وإن هما سهلين جداً في الـ implementation بتاعهم قوانينهم سهلة وتافهة يعني، وإن هما by default هما بيكونوا invariant للـ rotation. فاضل لنا كدا حاجة أخيرة خالص في المحاضرة وهي الـ regional descriptors إزاي أقدر أوصف الـ regions بقى نفسها مش الـ boundaries بتاعتها. اتكلمنا عن الـ boundary descriptors نخش بقى دلوقتي في
الـ regional descriptors. بردو في الأول هنبدأ بالحاجات الـ simple العادية خالص اول حاجة الـ area مساحة الشكل بتاعي. تاني حاجة عندي الـ compactness، الـ compactness اللي هي الضغط، أي حاجة مضغوطة قد إيه؟ فباجي أعمل زي دايرة وأشوف الشكل دوت قريب قد إيه من الدايرة. القانون بتاعها هي p squared على الـ area، بشوف الـ perimeter بتاع الشكل وأضربه في نفسه وأقسمه على الـ area
فبالتالي أحسب الـ compactness بتاعة الشكل. وطبعاً بيقول إن هو أكتر شكل compact، the most compact shape هو الدايرة. بيديني قيمة 4pi لما أحسب القسمة دي بتاعتي ده أكتر شكل، أي شكل تاني هيديني بقى قيم أعلى من الـ 4pi دي. عندي كمان حاجة اسمها الـ circularity ratio دي زي الـ rectangularity كدا اللي كنا اتكلمنا عليها من شوية اللي هي بتقيس لي how circular a shape is?
التانية اللي فاتت دي كانت p squared على A دي العكس بتاعها A على p squared الكلام ده مضروب في 4pi. عندي بردو الـ circular variance والـ elliptical variance اللي هو بردو بشوف هو الشكل دوت بعيد عن الدايرة بقد إيه لو أنا عندي الشكل ده لو أنا عايز أحوله لدايرة هتلاقي إن هو عاملك السهم ده بيقولك أنت بتشد دول كدا لبره وتضغط دول كدا لجوه
وهكذا بحيث إن أنت تقدر تخلي الشكل بتاعك دوت إيه يملا الدايرة يعني. ونفس الكلام طبعاً للـ elliptical variance إن أشوف بردو بيضاوي وهشوف الشكل بتاعي يقدر يملا البيضاوي ده إزاي. تاني حاجة الـ topological descriptors، الـ topology باختصار هو علم مهتم بعدد الأخرام اللي في الشكل بتاعي أو عدد الـ holes اللي في الشكل بتاعي. فبالتالي مثلاً الشكل دوت لو هو عن-
بردو، حرف زي حرف الـ A، الحرف ده فيه خرم واحد بس. بالنسبة له الشكل دوت مـ يفرقش أي حاجة عن حرف الـ O. فهو مش بيفرق، مش بيهتم بالـ deformations خالص، الشكل دوت لو أنا اعتبرت إن هو حتة صلصال كدا عندك أقدر أشده من حتة أطوله شوية أقصره بتاع بس المهم إن هو يفضل محافظ على نفس عدد الـ holes فهو لا يهتم غير بعدد الـ holes
كنا خدنا حاجة زمان وإحنا في ابتدائي عن الـ- اسمها الـ Euler formula إن هي بتاخد الـ vertices وتطرح منها الـ edges وتجمع الـ faces بيديك رقم اللي هو الـ E دوت. نفس الكلام دوت في الـ topology بس بنحسبه بحاجة اسمها الـ C والـ H. الـ C دي هي عدد الـ connected components، تمام والـ H دي هي الـ holes. تطرح ده من ده يديك الـ Euler number
number. فلو جينا لحاجة زي حرف الـ A دوت فيه كام connected component؟ هو كله شكل واحد بس يبقى دي 1 وفيه كام hole؟ واحدة بس يبقى دي 1 - 1 أدي كدا بـ 0 ده الـ Euler number بتاعه بـ 0. نيجي عند الـ B فيها كام connected component؟ هي بردو كلها شكل واحد بس، فيه كام بقى hole؟ فيه 2، يبقى 1 - 2 بيساوي -1، فده كدا الـ Euler بتاعه بـ -1. آخر حاجة معانا هي الـ texture.
والـ texture زي ما إحنا عارفين إن بيكون عندي زي شكل معين وبيكون repeated حوالين الـ region كله أو throughout الـ region كله بانتظام يعني. فتلاقي إن هو بيقول إن هو non-random arrangement of elementary parts. طيب أقدر أوصف الـ textures إزاي؟ عندي تلات طرق أساسية: الـ structural والـ statistical والـ spectral. لو خدناها من تحت لفوق كدا، الـ spectral إن أنا زي الـ fourier transform اللي كنت لما بعمل
الـ fourier، بشوف الحاجات دي قيمها عاملة إزاي أو متكررة بنسبة قد إيه. الـ statistical دوت زي ما إحنا لسه قايلينها من شوية، بتكون مشهورة جداً وسهلة جداً في الـ implementation بتاعها، بردو أقدر أحسب بقى شوية statistics عن الصورة نفسها وعن الـ texture نفسه. الـ structural على حسب الحاجات اللي أنا شايفها بعينيا بقى، مثلاً الـ parallel lines
والمسافات ما بينهم قد إيه وهكذا. الـ statistical هتلاقيه بردو بيتكلم على الـ moments زي ما إحنا لسه قايلين من شوية، فتلاقي مثلاً ان هو بيحسبلك لكل texture من الـ textures اللي عنده حاجات زي الـ mean والـ standard deviation والـ roughness و الحاجات دي كل حاجة عنده طبعاً ليها قانون خاص بيها، فيقدر يفرق بقى ما بين كل texture والتانية عن طريق القيم بتاعته على حسب هو هيستعمل أنهي descriptor من دول
أو يستعمل moment invariants زي اللي إحنا لسه متكلمين عليها من شوية اللي هما الـ first والـ second والـ third وكدا. فبيقول إن أنا بيكون عندي هنا شوية functions بيستعملوا عشان أقدر أوصف بيها الشكل بتاعي، وزي ما قلنا إن هما بيكونوا invariant للـ translation والـ scaling والـ rotation. بيكون عندي هنا في حتة الـ في الـ case بتاعة الـ textures بيكون عندي 7، هما دول الـ 7 moment invariants أقدر أحسبهم لكل صورة عندي
فهتلاقي إن هما مش بيختلفوا مع أي حاجة أنا بعملها في الصورة كـ translation يعني، هتلاقي مثلاً أن هي دي الصورة الأصلية بتاعتي طلعتلي الأرقام دي، حلو؟ لما جيت حركتها شوية هتلاقي نفس الأرقام بالظبط فيهم كلهم. لما جيت اخد نص الـ size بتاعها صغرت الصورة يعني شوية، هتلاقي بردو مطلعالي نفس الأرقام فيهم كلهم، وهكذا هتلاقي مطلعالي دايماً نفس الرقم مهما كنت غيرت ايه أو شقلبت ايه في الصورة، لفتها بتاع كدا، هتلاقيها دايماً بتطلعلي نفس
الأرقام بتاعتي في الـ moments invariants فبالتالي بتكون سهلة و invariant لكل المشاكل اللي ممكن تحصل في الصورة أو التلاعبات اللي ممكن تحصل في الصورة يعني. وبس كدا، دي كانت كل حاجة معانا في محاضرة النهاردة، أتمنى إنكم تكونوا استفدتم، وأشوفكم الفيديو الجاي. سلام عليكم.