Image_Processing_-_Lecture_5_(Segmentation)
السلام عليكم ورحمة الله وبركاته، ازيكم يا شباب عاملين إيه؟ النهارده إن شاء الله هنكمل course image processing وهنتكلم عن المحاضرة الخامسة. المحاضرة النهارده بعنوان image segmentation ودي الـ contents بتاعة المحاضرة بتاعتنا. هنتكلم الأول عن شوية basics عن الـ image segmentation وبعد كده هناخد نوعين عندنا. أول حاجة الـ edge based segmentation والـ region based segmentation. في النص هنراجع مراجعة سريعة الـ thresholding
ونشوف إيه بنستخدمه إزاي في الـ image segmentation. الأول يعني إيه أصلاً image segmentation؟ الـ segmentation هو إن أنا بـ subdivide الـ image لشوية regions أو objects. بقسمها لقطع صغيرة أو لأجزاء صغيرة بتفيدني في الحاجة اللي أنا هعملها. أشهر مثال لحاجة زي كده هو في الـ computer vision، say مثلاً إن أنا عايز أصور رقم عربية، عايز أعرف الـ objects اللي عندي في إيه
فأنا بـ detect سواء say مثلاً هنا في الصورة دي بـ detect الدواير بتاعتي وبعدين أعمل لها زي masking، فابقى عارف أماكنهم إيه بحيث أقدر بعد كده أخد كل دايرة اشتغل عليها، أعرف مثلاً ده جنيه ده نص جنيه ده ربع جنيه whatever، دي عملة إيه كذا يعني. نفس الكلام زي ما قلنا في نمرة العربية إن أنا بقدر أـ segment إن دي عربية وبعدين أـ segment نمرة العربية منها وهكذا. فأنا أي application فيه computer vision عندي
typically بتكون أول، أول حاجة عندي بعد طبعاً الـ preprocessing وإن أنا أظبط الـ contrast والـ brightness والحاجات اللي خدناها في الأول دي، بعمل بقى image segmentation بحيث أقدر أـ extract الـ objects اللي أنا محتاجها من الصورة بتاعتي. وبرضه بيقول لي معلومة سريعة كدة إن الـ automated segmentation صعب جداً، صعب إن أنا أعمل algorithm
automation، بتاخد، بتاخد أي صورة تعمل لها automation. فأنا غالباً بحتاج أعمل الموضوع ده بشكل manual إن أنا أقول له والله في الصورة دي هات لي الدواير أو أنا محتاج مثلاً كذا من الصورة دي. بشكل عام يعني معلومة سريعة كدة إن الـ automated segmentation صعب بشكل عام يعني. بس دي شوية أمثلة للـ image segmentation، هنلاقي مثلاً إن أنا في الصورة اللي على اليمين هنا بـ detect الـ edges، هنا في شجرة هنا في بيت هنا في
شجيرات صغيرة قدام البيت وكدة. هنا مثلاً تحتيها، دي أشعة x-ray بـ segment مثلاً الحتة اللي فيها الورم أو كدة. هنا برضه بـ detect إن في background، الخط، اللي هي خط أبيض وخط أبيض كدة ده الزرع اللي وراها، ده الكلب عرفت برضه أعمل الـ outline بتاعه، في هنا بقعة معينة سودة أو كدة. نفس الكلام صورة الشخص دوت بقدر أقسمه لـ upper half و lower half مثلاً
أمثلة تانية زي ما إحنا قلنا إن أنا بعرف أـ detect إن في عربية، بعرف بعد ما أنا عملت detection إن في عربية أقدر أقص وأـ extract بس منها الـ license plate بحيث إن أنا أقدر بعد ما جبت حتى الـ license plate أـ extract كل حرف لوحده أو كل رقم لوحده. عندي مثلاً لو أنا بعمل application للـ sign language ولو أنا عندي صورة زي كدة، أعرف أـ extract منها الإيد بس بحيث أعرف هي الإيد دي شكلها عامل إزاي
بتـ map لأنهي حرف في الـ sign language مثلاً، وده طبعاً في الحاجات اللي بالـ microscope بعرف، أعرف الـ cells الفلانية أقدر أـ extractـها، الـ cells اللي هي شكل معين أقدر برضه أـ extractـها، وأمثلة تانية كتير مش دول بس يعني. إحنا mainly هنـ deal مع إيه؟ مع الـ monochrome image segmentation. monochrome يعني إيه؟ يعني هي بتكون grayscale، ليها أحادية اللون بس، أبيض وأسود. مش هنـ deal مع إيه اللي فيها ألوان كتير
بيكونوا ليهم طريقتين، يا إما edge based إن أنا عندي صورة أهي فيها مثلاً كذا دايرة أو كذا شكل، فأنا بشتغل edge based إن أنا أي region حواليه نفس الـ edge خلاص ده كدة بقى region بالنسبة لي ده object كدة عندي. في حاجة تانية اسمها region based segmentation إن أنا بقف على pixel معينة لونها أصفر مثلاً
أخد كل الأصفر اللي حواليها وأفكس للأبيض اللي هو الخلفية مثلاً، فأنا كدة عرفت إن الـ region ده كله ده object واحد. فأنا عندي يا إما بشتغل edge based يا إما region based. وزي ما قلنا إن الـ region based بيستخدم الـ similarity among pixels، دول لونهم شبه بعض، لونهم قريب من بعض كدة، فدول بالنسبة لي بيبقوا على بعض كدة object واحد، أما الـ edge based بيتعامل مع الـ boundaries بتاعة الـ region
اللي عندي. تمام؟ ده مثال أهوت للـ edge based والـ region based segmentation، ده الـ edge وده الـ region، تمام؟ لو أنا عندي صورة smooth زي كدة بينفع معايا جداً الـ edge based ما بيقولش أي، ما بيقولش لأ، أما لو أنا عندي صورة noisy وده اللي بيحصل في أغلب الأوقات يعني
فاكرين الـ edge كان بيقيس لو أنا عندي أبيض وفجأة نزلت إسود وطلعت أبيض تاني، فأنا كدة عندي edge أو العكس، فأنا هنا عندي الصورة كلها noise أبيض وإسود أبيض وإسود، فبالتالي بيطلع الشكل العشوائي ده، ما فيش edge واضحة أقدر أشتغل عليها، ففي الـ case دي إيه؟ بينفعني أكتر الـ region based segmentation عن الـ edge based segmentation. تعالوا نبدأ بأول حاجة عندنا وهي الـ edge based approaches
mainly أنا بيكون عندي إيه؟ في الصورة بتاعتي يا إما هيكون عندي وأنا ماشي كدة خط line هي، يا إما هيكون عندي نقطة point، يا إما هيكون عندي خط line وأنا قطاعته، يا إما هيكون عندي شكل معين فأنا بشوف الـ edge بتاعته اللي هي زي ما انا- إسود وأطلع أبيض وأفضل مكمل throughout الشكل يعني. تعالوا نسترجع كدة من الذاكرة كنا بنقيس الكلام ده إزاي؟ كنا بنقيس الـ discontinuity اللي هي النقطة أو الخط أو الـ edge أو كدة
يا إما بالـ first derivative يا إما بالـ second derivative. الـ first derivative كان اسمه gradient والـ second derivative كان اسمه laplacian. دي كانت الـ equation بتاعة الـ first ودي الـ equation بتاعة الـ second. نفس المثال اللي احنا  كنا خدناه من محاضرتين تقريباً إن أنا ببدأ من الرمادي وأفضل أنزل كدة لحد ما أوصل للأسود، بعدين عندي نقطة فأنا طلعت فجأة ونزلت، وبعدين فضلت في الأسود، جالي خط فطلعت برضه ونزلت
وبعدين جالي edge لشكل فطلعت وفضلت مكمل throughout الشكل. أهو ده كان كدة الـ profile اللي إحنا لسه قايلين عليه، ودوت الـ first derivative الـ values بتاعة الـ first derivative ودي الـ values بتاعة الـ second derivative. كنا قلنا إن الـ second derivative بيقيس بشكل أدق الـ small difference أو الـ small intensities. فبنسأل سؤال، لو أنا عندي isolated point
إيه أفضل حاجة أقدر أقيس بيها؟ لو رجعنا للـ graph اللي ورا، الـ peak دي أو الـ spike دي كانت دي بتاعة الـ point اللي عندي. فلو بصينا على الـ first والـ second أنهي اللي بيديها أكبر magnitude؟ هلاقي إنه الـ second. في الـ second تقريباً كانت -11 أو -12 حاجة كدة، أما في الـ first هي يدوب كانت 6 بس، سواء تحت أو فوق
فبلاقي إن الـ second هو اللي بيـ detect حاجة زي كدة أحسن، هنلاقي إن هو فعلاً بيقول إن أنا بستخدم الـ laplacian وبعد كدة بعمل thresholding. دي الصورة اللي عندي بعد ما بعمل laplacian بيطلع لي الشكل دوت، أقدر أعمل thresholding فبالتالي بشيل كل الـ noise اللي عندي دي، ما يتبقاليش غير الـ point اللي أنا كنت عايز أعمل لها detection دي أصلاً. طيب بالنسبة للـ lines إيه أفضل detector؟ لو رجعنا برضه إيه ورا للـ graph هنلاقي إن الـ second derivative برضه
إداني هنا قيمة أحسن منها، هنا حوالي -5، هنا كانت حوالي 2 بس. فـ هنلاقي برضه إنه بيقول لي إن الـ laplacian هو الأفضل، ولكن الفكرة إنه بيعمل لي حاجة اسمها الـ double line effect. لو بصينا كدة في الصورة هنا هنلاقي إن هو ناحية بتبقى خط إسود وناحية بتبقى خط أبيض. فأنا محتاج أتخلص من الـ double line effect، بس اختصاراً يعني الـ laplacian برضه اللي هو الـ second derivative هو اللي بيفيدني أحسن في
مسألة الـ lines detection. طب بيسأل سؤال هل ينفع استعمل الـ gradient لكل direction؟ لأن إحنا كنا بنقول إن أنا لو انا عندي صورة بستخدم edge detection لكل الـ horizontal edges و edge detector لكل الـ vertical edges وبعدين أـ combine الاتنين مع بعض. طب هل لو أنا عندي خط كدة واحد في النص أبيض والباقي كله إسود، هل ينفع استعمل حاجة زي كدة؟ الإجابة لأ، ليه لأ؟ لأن أنا لو انا عندي الخط لو أنا وقفت عليه، خط بالطول أهو
هلاقي إن أنا بضربه كله في 0 وباخد اللي على يمينه واللي على شماله، فلو الخط بتاعي دوت هو فعلاً pixel واحدة بس كدة، هلاقي إن أنا ضربته في كله في أصفار وخدت الأسود اللي على يمينه والأسود اللي على شماله هما دول اللي ضربتهم في قيم، بالتالي هلاقي إن أنا مسحت الخط بتاعي كله. فبالتالي مش هينفع استعمل حاجة زي كدة، لأنه بيقول لي no، وبالتالي بنعمل في functions معينة بدل ما بتخليها أصفار في النص بتحط قيمة اللي هي الـ 2 دي بحيث إنها تعلي قيمة الحاجة اللي أنا واقف عليها، الخط اللي أنا واقف عليه
والباقيين هما اللي بـ negative 1 بحيث يبقى كلهم مجموعهم 0 في الآخر، بس الخلاصة القول إن أنا إيه؟ ما ينفعش يبقى عندي أصفار كدة في النص وأستخدم دوت عشان أـ detect الـ lines. فبالتالي بستعمل الـ matrix اللي قدامي دي وبيبقى فيه واحدة بقى لكل direction، دي مثلاً لو أنا horizontal، دي لو أنا vertical ودي لو أنا بزاوية 45 ودي لو أنا بزاوية negative 45
تمام؟ هلاقي أهو إن أنا في حالة زي كدة دي فعلاً بـ detect الخطوط اللي هي المايلة بشكل كويس جداً، هلاقي إن هو باين تحت أهي إن الخطوط دي حصل لها detection بشكل كويس، ممكن بعد كدة أعمل thresholding فيظهر لي الخطوط دي بشكل أوضح. طيب ماذا عن الـ edge detection؟ إحنا اتكلمنا عن الـ points وعن الـ lines، ماذا بقى عن الـ edges؟
الـ edges بيقول لي إن هو في لو الموضوع ideal هلاقي إن أنا كنت ماشي إسود فجأة طلعت أبيض وفضلت مكمل، فده الـ ideal. لكن في الواقع الدنيا بتكون washed out شوية ما عنديش الموضوع الـ ideal دوت، فبلاقي إن هي حاجة عاملة زي الـ ramp كدة، إن أنا كنت في الإسود وبعدين هناك أبيض وفي النص كان فيه transition band دي اللي أنا مشيت فيها من الإسود لغاية ما وصلت للأبيض
الموضوع بيكون مهزوز سيكة أو blurry سيكة مابيكونش ideal إن هو فجأة من الإسود قطع للأبيض على طول. فحاجة زي كدة لازم أعمل لها accounting. فلو جيت أحسب للـ ramp دوت first و second derivative، هلاقي إن في الـ first هو عامل شكل الـ square signal ده، أما في الـ second derivative هلاقي إن هو بـ 0. زي برضه ما قلنا من شوية إن أنا مابيكونش عندي إسود أو pure إسود و pure أبيض، الموضوع بيكون noisy جداً.
فأول case دي اللي إحنا لسه قايلينها إنه هو كان من الإسود وبعدين طلع براحته وراح على الأبيض ده كدة الـ first وده كدة الـ second، صح؟ لكن في الواقع بقى once إن أنا بدأت أزود noise وده الواقع اللي بيحصل يعني، هنا زودت noise، هنا زودت noise أكتر، وهنا زودت noise أكتر بكتير، هلاقي إن أنا الشكل الـ square اللي كان عندي في الأول دوت على آخر واحدة
.بقى شكله كأنها noise ثابتة، فأنا مابقتش عارف أـ detect الـ edges دي خالص. نفس الكلام في الـ second derivative الموضوع بقى إيه عشوائي جداً مش عارف أميز أصلاً إيه الـ edge اللي عندي من كتر الـ noise اللي موجودة عندي على الصورة يعني. فبيقول لي إن أنا لازم أستخدم استعمل image smoothing، وإللي هو image smoothing should be a serious consideration قبل ما استعمل الـ derivatives لو أنا متوقع إن أنا هيبقى عندي noise في الصورة بتاعتي
فلازم ساعتها أـ consider إن أنا أعمل image smoothing بحيث إن أنا أقلل كمية الـ noise الكبيرة اللي عندي دي أو دي بحيث إن أنا أحاول أقرب أكتر من الشكل الـ ideal دوت، إن أنا من إسود لأبيض حتى لو فيه مسافة بينهم اللي هي الـ gradient دي، بس أحاول أتخلص من أكبر قدر ممكن من الـ noise بالنسبة لي بحيث إن أنا حتى لو قربت للشكل ده
فيه noise أه ولكن باين عندي إن أنا شكل الـ square signal يعني. أما لو الصورة noisy جداً كدة هيبقى صعب جداً إن أنا استعمل الـ derivative based edge detectors. في approach تاني وهو إن أنا بعمل thresholding للـ gradient image وأحياناً بيتم استعمال الاتنين مع بعض، الـ smoothing والـ thresholding. ودي برضه مثال على الاتنين لو أنا دي الصورة اللي عندي، لما بستعمل horizontal edge detector بيعمل لي كدة
ولما بستعمل الـ vertical بـيديني دوت، لما بـ combineـهم مع بعض بـيديني الشكل ده. لو أنا عملت smoothing أكتر للصورة هلاقي إن أنا الموضوع ماهواش صارخ زي اللي قبلها، الصورة اللي فاتت كانت بيضا جداً أما هنا بـقلب بينهم أهو، هلاقي إن الموضوع هنا أهدى شوية. الـ horizontal يعتبر ماقاسش فعلاً حاجة غير الـ horizontals بس، والـ vertical نفس الكلام ماقاسش غير الـ verticals بس والحاجات اللي هي طبعاً اللي فيها زاوية معينة بتتقاس في الاتنين بنسبة قليلة
بحيث إن أنا لما بعمل لهم combination مع بعض بيدوني إيه أكانى قستهم بشكل كويس يعني، فبلاقي إن أنا قست الموضوع بشكل أوضح مش الدنيا كلها بيضا زي الصورة اللي فاتت دي. طيب يعني إحنا كدة دلوقتي عرفنا إن أنا ماينفعش مع الـ edges أستعمل الـ second derivative أو الـ laplacian بشكل مباشر، صح؟ لازم أعمل smoothing في الأول
أول. طب ما ينفعش أـ combine الاتنين دول في algorithm واحدة بدل ما أقعد أعمل smoothing بعدين أنده وأعمل laplacian وكدة؟ قال لك آه ينفع، فيه واحد اسمه Marr-Hildreth دوت اخترع edge detector وقال إنك طالما الـ laplacian too sensitive للـ noise فأنا قبل ما أعمله أنا هستعمل smoothing Gaussian filter اللي هو دي الـ equation بتاعته
وبدي له أي size في الأول وبسميه الـ Laplacian of a Gaussian، LoG، تمام؟ دوت الاتنين مع بعض إن هو بيديني الـ laplacian وبيعمل smoothing كمان بالـ Gaussian قبليه. هلاقي إن هو الـ Gaussian أهوت اللي إحنا واخدينه من فوق، تمام؟ ومضروب في الـ laplacian اللي هي الـ equation اللي في الأول دي. العلامة دي هي الـ laplacian والعلامة دي هي الـ Gaussian، تمام؟
أهو ده شكل الـ graph بتاع الـ Marr-Hildreth edge detector وده شكل الـ mask بتاعه. وده كدة example على الـ algorithm بتاعته دي الصورة الأصلية بتاعتي ودوت بعد ما أنا عملت الـ steps 1 و 2 بتاعة الـ Marr-Hildreth اللي هو الـ smoothing والـ gradients، ودي الـ final image بتاعتي بلاقي إن أنا الـ edges عندي بقت thin وواضحة جداً إن أنا عندي فعلاً edges
صريحة حتى لو الصورة كان فيها noise في الأول لكن هو بيقدر يتخلص منها بشكل شبه مثالي يعني وبيطلع لي edges بشكل واضح زي ما إحنا شايفين في الصورة اللي تحت دي. عندي برضه نوع تاني من الـ edge detectors اسمه الـ Canny edge detectors دوت بيـ combine كذا حاجة مع بعض الـ smoothing وبعدين بيحسب الـ gradient وبعدين بيحسب الـ edge angles كمان وفي الآخر بيعمل thresholding كمان فوقيه
إمتى بستعمل ده وإمتى بستعمل ده؟ قال لك هو الموضوع بيكون trade-off بشوف أنا عايز improved performance ولا عايز السرعة. طبعاً كل ما بزود computations كل ما الموضوع بيديني accuracy أحسن والـ performance أحسن ولكن بيبطأ جداً الـ speed بتاعه عشان بيحتاج يحسب computations أكتر. وهنا بيقارن لي التلاتة بقى مع بعض، دي الصورة الأصلية، دي الصورة لما أنا عملت thresholding للـ gradient بس
أما الصورة تحت على الشمال دي بتاعة الـ Marr-Hildreth، أما الصورة تحت على اليمين دي بتاعة الـ Canny edge detector. طبعاً هي أفضل واحدة فيهم وأكثرهم اعتمادية ولكن زي ما قلنا هو computationally intensive فأنت بتشوف هل حاجة زي الـ Marr-Hildreth تكون كافية بالنسبة لك ولا محتاج دقة أكتر ومش مهم الوقت فساعتها بتستعمل الـ Canny. هو trade-off زي ما قلنا ما بين الـ performance والـ s
peed. فاللي توصلنا له لحد دلوقتي هو إن أنا الـ fundamental steps لأي edge detector إن أنا أول حاجة لازم أعمل image smoothing عشان الـ noise بتبوظ لي عملية الـ edge detection، بعد كدة بعمل edge points detection، تمام؟ إن أنا بعرف الـ edges أماكنها فين يعني، وآخر حاجة عندي بعملها اسمها edge localization ودي بستعمل فيها حاجة اسمها الـ Hough transform
الـ Hough transform دي الصراحة هحط لكم لينك لفيديو بيشرحها بشكل كويس جداً، وهـ skipـها دلوقتي من الشرح عشان ما أطولش فيها إنها معقدة شوية، وهخش على اللي بعدها على طول، وهيطلع لكم فوق دلوقتي كدة اللينك بتاع الفيديو ممكن تشوفوه ونرجع نكمل بقية المحاضرة بتاعتنا عادي. عندنا برضه طرق مختلفة تانية بنقدر نعمل بيها segmentation، هاخد بس شوية عناوين ليها.
في الـ active contours، في منها الـ snakes والـ scissors والـ level sets، وفي الـ split and merge. تعالوا ناخد أمثلة سريعة جداً كصور بس على كل حاجة منهم، هتلاقوا كل صورة مكتوب الـ label بتاعها والـ label دوت عبارة عن إيه. مثلاً حاجة زي الـ active contours هو بيقدر يمشي على الـ edge بتاعة الحاجة بالظبط بدقة يعني كويسة
فبنقدر نستعمل حاجة زي كدة في الـ lip tracking إن أنا فيه واحد بيتكلم فأنا أقدر أخد الفيديو وأعرف هو بقه بيقول إيه حتى لو ما فيش صوت على الفيديو وأعرف أتوقع هو إيه الكلمات اللي هو بيقولها أو الحروف اللي هو بيقولها، فطبعاً قبل ما أعمل حاجة زي كدة أنا محتاج أعمل image segmentation للـ lips بتاعته بحيث أشوف شكلها عامل إزاي، مضمومة بنسبة قد إيه، مفتوحة بنسبة قد إيه وكدة، فأقدر أعمل lip tracking بشكل كويس فبينفعني حاجة زي الـ snakes بتاعة الـ active contours في حاجة
زي كدة. حاجة تانية زي الـ level sets هو بيبدأ بيحط دوائر كدة في الصورة وبعدين على حسب الـ algorithm نفسها بيكبر دوائر معينة وبيصغر دوائر، وبعدين بيـ combine الدوائر اللي بيكبروا لغاية ما يلزقوا في بعض لحد ما يلاقي نفسه إنه في الآخر قدر يعمل الـ edges اللي شبه بعض أو نفس اللون ويفصلهم عن الـ backgrou
round. ده example تاني للـ level sets زي ما قلنا، إنه مثلاً هنا الـ threshold بتاعته إنه عايز يـ detect الحاجات البني فبيبتدي إن الدوائر اللي في البني يكبرها شوية، الدوائر اللي مش بني زي الأخضر بيصغرها لحد ما في الآخر نلاقي إن الدوائر اللي هي كانت بني دي كبرت لحد ما كلهم كونوا السنجاب ده وقدر يفصله من الـ foreground على الـ background. وزي ما واضح من المثال دوت، ده بينفع يُستعمل مع الـ color images كمان مش بس مع الـ monochrome أو الـ bla
ck and white. هنتكلم عن حاجة كمان النهارده وهي الـ thresholding. الـ thresholding بيقول لك إن هو غالباً بيكون خطوة أولية أو في النص لأي عملية segmentation، لأن الـ segmentation بيعتمد على الـ values بتاعة الـ pixels اللي عندي فبحتاج أعمل thresholding. مثال زي كدة على الصورة اللي عندي، كدة أنا عملت thresholding بـ value مناسبة، قدرت أـ extract الكروت اللي عندي بالـ symbols اللي جواها بالأرقام بالحروف بكل ده.
أما مثلاً لو أنا عملت حاجة زي كدة، عملت thresholding too low معناها إن أنا حددت شوية قيم سوداء بس هي دي الايه؟ اللي تبقى معايا في الـ... فلو أنا مثلاً عندي histogram وعندي الأسودات كدة مثلاً وبعدين الأبيضات كدة، تمام؟ فأنا لو قطعت في النص بالظبط فأنا كدة وصلت لحاجة كويسة. أما ممكن أقطع هنا فبالتالي أنا أهملت شوية قيم من الأسود، فهلاقي إن أنا مثلاً الحروف اللي فوق دي أو الأرقام
مش ظاهرة معايا كويس حتى الأشكال شكلها noisy جداً. وممكن أقطع قدام شوية فألاقي إن أنا حتى حاجات زي الظل أو اللي هي الحاجات الرماديات أنا حسبتها معايا، فبالتالي دي بقت thresholded too high. مع إن أنا هنا أخدت قيمة كبيرة جداً وهنا أنا أخدت قيمة قليلة جداً. أنا دايماً بحتاج أدور على القيمة اللي في النص بحيث أوصل لشكل مناسب جداً للـ
للـ usage بتاعتي أو للصورة اللي أنا معايا أصلاً وعايز أشتغل عليها. ده اللي إحنا لسه متكلمين عنه أهوت، إن أنا محتاج أقطع في النص ما بين الـ two peaks اللي عندي، الـ peak بتاعة الأسودات والـ peak بتاعة الأبيضات. وبيقول إن الموضوع لما بيكون sufficiently distinct إن أنا عندي قمتين بس، قمة للأبيض وقمة للأسود، ساعتها أقدر أستخدم single value
أـ segment عندها. أما لو عندي أكتر من قمة فساعتها أنا بحتاج أـ segment عند مكانين معينين وأـ combine بقى بطريقة معينة أو بـ algorithm معينة ما بين الـ two thresholded images اللي عندي. بيقول لي برضه إن أنا عندي أكتر من نوع من الـ thresholding، ممكن نبص له على إنه زي transformation أو method معينة اللي هي الـ T دي بتُطبق على x و الـ y و P(x,y) و f(x,y).
where إن الـ x و y دول الـ indices بتاعتي، الـ f(x,y) دي قيمة الـ pixel اللي عندي، والـ P(x,y) دي some neighborhood property. فأنا لو أنا فكست لدي خالص وطبقت على الـ f(x,y) بس اللي هي قيمة الـ pixel اللي عندي، فدوت أنا بعمله على الصورة كلها بنسميه دوت global thresholding. أما لو عملت P(x,y) معايا كمان في الـ
في الـ transformation أو الـ thresholding، فكدة معناها إن أنا معتمد على حاجة في الـ neighborhood أو في الحاجات اللي حواليا يعني، فدوت بيُسمى الـ local thresholding. لو كمان دخلت الـ x و y معايا، اللي هما مكان الـ pixel دي معينة في الصورة مش بس قيمتها، دوت بيُسمى الـ dynamic والـ adaptive thresholding عشان هو بيعتمد على الـ spatial coordinates. أنا لو أنا فوق ع الشمال في الصورة غير لو أنا تحت على اليمين غير لو أنا في النص غير لو فوق على اليمين غير لو تحت على الشمال
فدوت طبعاً بيعتمد على الـ spatial بنسميه dynamic أو adaptive thresholding على حسب مكانه في الصورة على حسب الـ output بتاعي. يبقى لو أنا معتمد على الأربع حاجات اللي هما المكان والـ neighborhoods وقيمة الـ pixel اللي عندي، دوت بنسميه dynamic أو adaptive thresholding. لو مش معتمد على مكاني في الصورة، معتمد بس على الـ pixel وقيمتها
واللي حواليها بنسميه local thresholding، أما لو معتمد على القيمة بس بنسميه global thresholding. على حسب أنت أياً كان مكانك فين، أياً كان جنبك إيه، أنا بس بشوف قيمتك بكام، لو أنت بـ 50 هعمل كذا، لو بـ 100 هعمل كذا، أياً كان مكانك وأياً كان مين جيرانك اللي حواليك. ده مثال على الـ global thresholding بيوضح لي إنه بيعتمد بشكل كبير جداً على أنا إزاي أقدر أقسم الـ histogram بتاعي
لو ينفع أقسمه لـ two partitions، ده ساعتها الـ global بينفع معايا بشكل كويس. فأنا بـختار قيمة الـ T بتاعتي دي، اللي هي اللي أنا قاطع عندها دي، وأقول والله لو أنا الـ f(x) لو أنا قيمة الـ pixel اللي أنا واقف عليها دي أكبر من الـ T خلاص اعتبرها تبع الـ group الفلاني اللي هو بـ 1، لو هي أصغر من أو بتساوي قيمة الـ T اللي أنا هقطع عندها ساعتها خلّيها في الـ group اللي بـ 0.
0. فبالتالي لو أنا عندي حاجة زي كدة، وجيت أقطع عند قيمة معينة. فبقول والله أي حاجة في الغوامق اللي هي الأسود دي احتفظ لي بيها تكون بـ 0، وأي حاجة في الرماديات خلّيها بـ 1، فبالتالي في الآخر أنا قدرت أستخرج أو أـ extract البصمة من الصورة وأفكس أو أطنش لأي حاجة شكلها رمادي أو مش مناسبة ليا في الصورة. فده اللي بيحصل أهوت إن أنا بختار initial T
وبعدين بـ segmentـها accordingly للـ T دي، بحطها في group 1 و group 2، حتى لو الـ T دي مش هي أفضل حاجة. بعدين بحسب الـ means والـ error والكلام ده كله، وبعدين أجرب أعمل threshold جديدة وأفضل أكرر الموضوع دوت لغاية ما أوصل لأقل error بالنسبة لي، فأنا كدة وصلت لأحسن T أقسم عندها
بيقول لي برضه إن الموضوع بيُعتبر زي decision theory problem، decision أنا هقرر أخد الـ T دي عند أنهي قيمة معينة عشان أقدر أمـ minimize الـ average error اللي عندي، تمام؟ عندي طريقة تانية بقدر أحسب بيها الـ global thresholding وهي الـ Otsu أو الـ optimal global thresholding. الـ Otsu ده بيعتمد على إيه؟ بيعتمد على إن هو أنا عندي الصورة أهوت أنا عايز أقسمها لـ two groups صح؟ جروب أخليّه أبيض وجروب أخليّه إسود.
بيعتمد ان هو جوه الـ group  الواحد يختار أقل variance أو يعني الحاجات اللي هـأـ assignـها دي تطلع له أقل variance جوه االـ group  ده وجوه الـ group ده، وبالتالي هيبقوا كلهم قريبين من بعض. فبالتالي بيترتب على دوت إنه بيعلي جداً الـ variance اللي ما بين الـ classes. فهو بيقلل بيـ minimize أهو الـ within class variance اللي جوه group واحد بيقلل الـ variance
أو التباعد اللي بينهم، وبناءً على دوت بيعلي أو بيـ maximize الـ between class variance. المسافة اللي بينهم أو الاختلاف اللي ما بين الـ two groups بيكون أعلى فبالتالي بيقسم بشكل أفضل من الطريقة العادية اللي إحنا خدناها من شوية دي. زي ما إحنا بنقول أهوت إنه بيختار الـ T بناءً على إن هما الحاجات اللي جوه
الـ group الواحد يكون الـ variance بتاعها قليل، والحاجات اللي جوه الـ class ده برضه يكون قليل، فبالتالي الـ variance اللي ما بين الـ two classes يكون كبير. طيب إيه الـ drawbacks بتاعة الـ Otsu's method؟ أول حاجة إنه بيـ assume إن الـ histogram بتاعي bimodal، يعني إيه bimodal؟ يعني إنه ليه قمة كدة وقمة تانية كدة. أما لو كان الـ histogram بتاعي فيه كذا قمة
ساعتها الـ Otsu's هيفشل مش هيقدر يفصلهم بشكل كويس. تاني حاجة لو الـ two classes عندي مش are very unequal، يعني إيه؟ يعني أنا عندي الـ histogram أهوت، فأنا عندي class كبير كدة و class تمام كدة. فأنا أصلاً عندي range كبير جداً في الـ class بتاعي، فبالتالي مش هقدر أقلل الـ variance زي ما هو بيحاول يعمل ما بين الـ class الواحد
فالموضوع ساعتها مابيكونش الـ Otsu's هو أفضل حاجة استعملها في حاجة زي كدة. طيب كانت إيه مشاكل الـ global thresholding اللي أخدناها قبل الـ Otsu's؟ إنه برضه بيشتغل only مع الـ bimodal histograms. لو الصورة فيها أكتر من peak أو أكتر من trimodal مثلاً أو أكتر من كدة، ساعتها إن أنا بحتاج أعمل أكتر من single threshold. باخد زي ما قلنا threshold هنا و threshold هنا
هو أه، بعد كدة هتعامل بقى مع الصور بشكل مختلف أو أـ combineـهم بطريقة معينة. مشكلة تانية بتواجهني مع الـ global thresholding هي الـ noise، إن أنا لو انا عندي الصورة كدة في الشكل الـ ideal بتاعها، هلاقي إن أنا عندي الأسودات أهيه والأبيضات أهيه بس كدة. عندي شوية noise قليلة، هلاقي إن انا الأسود ده اتفرش شوية والأبيض اتفرش شوية، بس أنا لسه الموضوع عندي واحد أو أقدر أفصل بينهم
أما لو الـ noise زادت عندي بالشكل دوت، هلاقي إن انا الأسود بقى مليان أبيضات جواه والأبيض بقى مليان إسودات جواه وفيه رمادي كتير، هلاقي إن أنا ساعتها الـ histogram بقى سايح كله كدة في بعضه، فبالتالي ماعنديش حاجة أقدر أقسم عندها بالظبط. عشان كدة كنا دايماً بنتكلم إن أنا محتاج أعمل smoothing عشان أتخلص من الـ noise، الـ noise دايماً بتسبب لي مشكلة في أي حاجة بتواجهني
فبالفعل هلاقي إن هو في الـ slide اللي بعدها بيقول لي إن الـ solution لحاجة زي كدة هو الـ smoothing. دي الصورة اللي كانت عندي في الأول تمام؟ وده الـ histogram بتاعها، ودوت لما جيت أعمل لها Otsu's method. تحت هنا نفس الصورة بس عملت لها smoothing بـ averaging mask، هو كان أهيف smoothing mask عندي، اللي هو بيجمع الـ pixel والقيم اللي حواليها ويقسمهم على الـ size بتاع الـ mask
فعملت لها averaging 5x5 mask عادي، طلع لي الـ result دوت، فساعتها قدرت أقسم. فلما استعملت الـ Otsu's method إداني الشكل دوت أحسن بكتير طبعاً من الشكل اللي قبليه، فـ دايماً دايماً بنعمل smoothing عشان نتخلص من الـ noise قبل ما نعمل thresholding أو edge detection أو غيره. بتواجهني برضه مشكلة كمان لو الصورة متصورة فيها الإضاءة مختلفة، يعني أنا لو عندي الصورة متصورة بشكل مثالي زي كدة هقدر أعمل لها segmentation
thresholding عادي جداً. أما لو متصورة مثلاً فيه flash ضارب في جنب أو كدة زي الصورة اللي تحت كدة، هلاقي إن الناحية دي أغمق والناحية دي أفتح، لو جيت أعمل هنا الـ thresholding هلاقي إن أنا الموضوع باظ مني خالص، فلازم أـ handle موضوع الـ illumination دوت أو اختلاف الإضاءة. مثال تاني لحاجة زي كدة لو الصورة دي مش عندي مش كويسة الناحية اللي تحت دي
غامقة شوية كان فيه ظل مثلاً اللي بيصور عليها او كدة، بالتالي لما باجي أعمل الـ thresholding بلاقي إن الجزء اللي تحت ده كله طار مني من الصورة. حاجة زي كدة بحلها إزاي؟ ساعات بنستعمل حاجة اسمها الـ inverse shading، اللي هو إن أنا والله أنا شايف إن الناحية دي هنا غامقة والناحية اللي فوق دي فاتحة، فأنا هعمل لها حاجة تفتح ده شوية وتغمق اللي فوق شوية فبالتالي أـ balance الموضوع
أو إن أنا بستعمل variable thresholding. الـ variable thresholding دوت بيتعمل إزاي؟ بقسم الصورة لشوية non-overlapping rectangles. يعني أنا مثلاً عندي الصورة بتاعتي أهيه، هروح مقسمها كدة دي 1 2 3 4 5 6، ستة regions وأتعامل مع كل region لوحده، فبالتالي لو أنا كانت الصورة مثلاً غامقة في الناحية دي، فلما أجي أتعامل مع الحتة دي لوحدها وأحسب لها الـ histogram هلاقي إن هو فعلاً أقدر أقسم في حتة معينة
ودي هيبقى ليها histogram مختلف فأقدر أقسمها عنده، فدي طريقة بتعامل بيها مع الـ variable thresholding إن أنا بقسم كل حاجة لوحدها. زي ما لسه قايلين هو إن الـ illumination بيكون approximately uniform، الناحية دي كلها غامقة، فتمام أقدر أتعامل معاها غير لما أتعامل مع الصورة بشكل كلي، فبالتالي حاجات بتروح على حساب حاجات تانية. أهو ده مثال تاني عليها برضه إن أنا لما بروح مقسم الصورة للـ
2 في 3 كدة اللي هما 6 regions دول، وهتعامل مع كل region لوحده وأطبق عليه Otsu، بيطلع لي الشكل أكانه مكانش فيه أي مشكلة في الصورة بتاعتي. أما في حين إن أنا لو كنت اتعاملت معاها زي ما هي في الأول، الموضوع أكتر ماهواش bimodal والموضوع كله محذوف ناحية الشمال في الإسود، فساعتها كنت لازم أعمل حاجة زي الـ variable thresholding
وبالتالي أوصل لنتيجة كويسة زي اللي وصلنا لها في الآخر دي. وطبعاً أحياناً مابيكونش كفاية إن أنا أقسمها لـ 4 أو 6 حتت بس، فمحتاج أقسمها أكتر بحيث يديني قيم أحسن. فده متوقع أو عادي إن أنا لو مكفاش إن أنا أقسمها 4 rectangles بقسمهم 6، بقسمهم 8، بقسمهم 16، عادي لحد ما أوصل لأحسن قيمة أنا عايز أو أحسن result أنا عايز أوصل له في الآخر. مثال تاني على الـ variable thresholding إن أنا لو مصور حاجة مطبوعة زي كدة
الإضاءة فيها بايظة جداً لو أنا اتعاملت مع الـ global thresholding على طول زي اللي تحت دي، هلاقي إن انا النص الغامق من الصورة كله طار عندي وحتى النص اللي في الأول مش واضح منه أي حاجة. أما لما بعمل local thresholding أو variable thresholding إن أنا بقوم واخد مثلاً كل حتة لوحدها وكل حتة لوحدها وكل حتة لوحدها وهكذا. بقدر ألاقي إن انا الحاجة طالعة لي بشكل واضح في الآخر وأقدر أميز الحروف وأميز الكتابة اللي مكتوبة في الصورة بتاعـ
برضه من غير ما ندخل في math كتير و equations وكدة، بيقول لي بس إن الـ local thresholding دوت بيعتمد على إن أنا بعمل threshold according to the mean and standard deviation of a neighborhood. نفهم بس اختصاراً إن هو معتمد على الـ neighborhood على حسب الـ mean والـ standard deviation بتاعها، بشوف أنا اللي حواليّ الـ mean والـ standard deviation بتاعهم إيه وعلى أساسه بعمل threshold للـ pixel اللي أنا واقف عليها.
example تاني زي اللي إحنا لسه شايفينه من شوية إن برضه الناحية دي كانت غامقة عندي فباظت لما عملت global. أما لما بعمل local thresholding الدنيا بتكون أوضح، حتى في الحتة اللي فوق دي اللي هي مكنتش متضررة أوي، طالعتلي بشكل أحسن بكثير في الصورة التانية دي. فبالتالي الـ local thresholding أحسن. طبعاً زي ما إحنا خلاص تعودنا إن الحاجة الأحسن
بتحتاج computation أكتر إن أنا بدل ما بشتغل على الصورة مرة واحدة بقسمها وأشتغل على كل جزء لوحده، بس ده طبيعي إن أنا عشان أـ obtain better results لازم أحسب calculations أكتر وأطول شوية في الحسبة بتاعي. عندي برضه طريقة تانية غير الـ image partitioning إن أنا كنت بقسمها rectangles، إن أنا بستعمل moving average. ساعتها بمشي زي zigzag pattern كدة على الصورة فده بيقلل لي الـ مشكلة الـ illumination بتاعتي.
ده مثال عليها إن أنا لو عندي صورة زي كدة. لو أنا عملت لها Otsu's عادي جداً Otsu's method بـ global thresholding هيديني كدة. أما لو اتعاملت local thresholding بـ moving average هوصل لشكل كويس جداً زي اللي على اليمين ده. فبالتالي أنا عندي يا إما استعمل moving average يا إما أتعامل مع الـ image partitioning. المهم إن الـ global thresholding مش هو أحسن حل وغالباً دايماً بحتاج أعمل local thresholding. سواء بقى هستخدم الـ moving average ولا هستعمله بال image partitioning مش هتفرق
تفرق على حسب الـ case اللي معايا بشوف ساعتها أنهي ينفع معاها أكتر. بس كدة، دي كانت كل حاجة معانا في محاضرة النهارده. أتمنى تكونوا استفدتم. زي ما قلت لكم جزء الـ Hough لو حد منكم مشفتهوش لسه هتلاقوا الـ link في الـ description تحت وهـيظهر لكم دلوقتي على الشاشة برضه. شوفوه ونبقى كدة خلصنا المحاضرة الخامسة وأشوفكم الفيديو الجاي. أتمنى تكونوا استفدتم. سلام.