يسمح تجزئة الصور، أحد الإجراءات الأساسية في رؤية الكمبيوتر، للنظام بتحليل المناطق المختلفة داخل الصورة وتحليلها. سواء كنت تتعامل مع التعرف على الأشياء، أو التصوير الطبي، أو القيادة الذاتية، فإن التجزئة هي ما يقسم الصور إلى أجزاء ذات معنى.
على الرغم من أن نماذج التعلم العميق لا تزال تحظى بشعبية متزايدة في هذه المهمة، إلا أن التقنيات التقليدية في معالجة الصور الرقمية لا تزال قوية وعملية. تتضمن الأساليب التي تتم مراجعتها في هذا المنشور تحديد العتبات، واكتشاف الحواف، والاعتماد على المنطقة، والتجميع من خلال تنفيذ مجموعة بيانات معروفة جيدًا لتحليل صور الخلايا، وهي مجموعة بيانات الصور MIVIA HEp-2.
مجموعة بيانات الصور MIVIA HEp-2 هي مجموعة من الصور للخلايا المستخدمة لتحليل نمط الأجسام المضادة للنواة (ANA) من خلال خلايا HEp-2. وهو يتألف من صور ثنائية الأبعاد تم التقاطها من خلال الفحص المجهري الفلوري. وهذا ما يجعله مناسبًا جدًا لمهام التجزئة، وأهمها المهام المتعلقة بتحليل الصور الطبية، حيث يكون الكشف عن المنطقة الخلوية هو الأهم.
الآن، دعنا ننتقل إلى تقنيات التجزئة المستخدمة لمعالجة هذه الصور، ومقارنة أدائها بناءً على نتائج F1.
العتبة هي العملية التي يتم من خلالها تحويل الصور ذات التدرج الرمادي إلى صور ثنائية بناءً على شدة البكسل. في مجموعة بيانات MIVIA HEp-2، تعد هذه العملية مفيدة في استخراج الخلايا من الخلفية. إنها بسيطة وفعالة إلى مستوى كبير نسبيًا، خاصة مع طريقة أوتسو، حيث أنها تحسب ذاتيًا العتبة المثلى.
طريقة أوتسو هي طريقة عتبة تلقائية، حيث تحاول العثور على أفضل قيمة عتبة للحصول على الحد الأدنى من التباين داخل الفئة، وبالتالي فصل الفئتين: المقدمة (الخلايا) والخلفية. تقوم الطريقة بفحص الرسم البياني للصورة وتحسب العتبة المثالية، حيث يتم تقليل مجموع تباينات كثافة البكسل في كل فئة.
# Thresholding Segmentation def thresholding(img): # Convert image to grayscale gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # Apply Otsu's thresholding _, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY cv.THRESH_OTSU) return thresh
يتعلق اكتشاف الحافة بتحديد حدود الكائنات أو المناطق، مثل حواف الخلايا في مجموعة بيانات MIVIA HEp-2. من بين الطرق العديدة المتاحة لاكتشاف التغيرات المفاجئة في الشدة، يعد Canny Edge Detector الطريقة الأفضل وبالتالي الأنسب لاستخدامها في اكتشاف الحدود الخلوية.
Canny Edge Detector عبارة عن خوارزمية متعددة المراحل يمكنها اكتشاف الحواف من خلال اكتشاف المناطق ذات التدرجات القوية في الشدة. تتضمن العملية التجانس باستخدام مرشح غاوسي، وحساب تدرجات الكثافة، وتطبيق القمع غير الأقصى لإزالة الاستجابات الزائفة، وعملية العتبة المزدوجة النهائية للاحتفاظ بالحواف البارزة فقط.
# Edge Detection Segmentation def edge_detection(img): # Convert image to grayscale gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # Apply Gaussian blur gray = cv.GaussianBlur(gray, (3, 3), 0) # Calculate lower and upper thresholds for Canny edge detection sigma = 0.33 v = np.median(gray) lower = int(max(0, (1.0 - sigma) * v)) upper = int(min(255, (1.0 sigma) * v)) # Apply Canny edge detection edges = cv.Canny(gray, lower, upper) # Dilate the edges to fill gaps kernel = np.ones((5, 5), np.uint8) dilated_edges = cv.dilate(edges, kernel, iterations=2) # Clean the edges using morphological opening cleaned_edges = cv.morphologyEx(dilated_edges, cv.MORPH_OPEN, kernel, iterations=1) # Find connected components and filter out small components num_labels, labels, stats, _ = cv.connectedComponentsWithStats( cleaned_edges, connectivity=8 ) min_size = 500 filtered_mask = np.zeros_like(cleaned_edges) for i in range(1, num_labels): if stats[i, cv.CC_STAT_AREA] >= min_size: filtered_mask[labels == i] = 255 # Find contours of the filtered mask contours, _ = cv.findContours( filtered_mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE ) # Create a filled mask using the contours filled_mask = np.zeros_like(gray) cv.drawContours(filled_mask, contours, -1, (255), thickness=cv.FILLED) # Perform morphological closing to fill holes final_filled_image = cv.morphologyEx( filled_mask, cv.MORPH_CLOSE, kernel, iterations=2 ) # Dilate the final filled image to smooth the edges final_filled_image = cv.dilate(final_filled_image, kernel, iterations=1) return final_filled_image
يقوم التقسيم على أساس المنطقة بتجميع وحدات البكسل المتشابهة معًا في مناطق، اعتمادًا على معايير معينة مثل الكثافة أو اللون. يمكن استخدام تقنية تجزئة مستجمعات المياه للمساعدة في تجزئة صور خلايا HEp-2 لتتمكن من اكتشاف تلك المناطق التي تمثل الخلايا؛ فهو يعتبر شدة البكسل بمثابة سطح طبوغرافي ويحدد المناطق المميزة.
تجزئة مستجمعات المياه تتعامل مع شدة البكسل كسطح طبوغرافي. تحدد الخوارزمية "الأحواض" التي تحدد فيها الحدود الدنيا المحلية ثم تغمر هذه الأحواض تدريجيًا لتوسيع مناطق متميزة. هذه التقنية مفيدة جدًا عندما يريد المرء فصل الأشياء الملامسة، كما هو الحال في حالة الخلايا داخل الصور المجهرية، ولكنها قد تكون حساسة للضوضاء. يمكن توجيه العملية بالعلامات ويمكن في كثير من الأحيان تقليل التقسيم الزائد.
# Region-Based Segmentation def region_based(img): # Convert image to grayscale gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # Apply Otsu's thresholding _, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV cv.THRESH_OTSU) # Apply morphological opening to remove noise kernel = np.ones((3, 3), np.uint8) opening = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2) # Dilate the opening to get the background sure_bg = cv.dilate(opening, kernel, iterations=3) # Calculate the distance transform dist_transform = cv.distanceTransform(opening, cv.DIST_L2, 5) # Threshold the distance transform to get the foreground _, sure_fg = cv.threshold(dist_transform, 0.2 * dist_transform.max(), 255, 0) sure_fg = np.uint8(sure_fg) # Find the unknown region unknown = cv.subtract(sure_bg, sure_fg) # Label the markers for watershed algorithm _, markers = cv.connectedComponents(sure_fg) markers = markers 1 markers[unknown == 255] = 0 # Apply watershed algorithm markers = cv.watershed(img, markers) # Create a mask for the segmented region mask = np.zeros_like(gray, dtype=np.uint8) mask[markers == 1] = 255 return mask
تميل تقنيات التجميع مثل K-Means إلى تجميع وحدات البكسل في مجموعات متشابهة، وهو ما يعمل بشكل جيد عند الرغبة في تقسيم الخلايا في بيئات متعددة الألوان أو معقدة، كما هو موضح في صور خلايا HEp-2. بشكل أساسي، يمكن أن يمثل هذا فئات مختلفة، مثل المنطقة الخلوية مقابل الخلفية.
K-means هي خوارزمية تعلم غير خاضعة للرقابة لتجميع الصور بناءً على تشابه البكسل في اللون أو الكثافة. تقوم الخوارزمية باختيار النقط الوسطى K بشكل عشوائي، وتخصيص كل بكسل إلى أقرب النقطه الوسطى، وتحديث النقطه الوسطى بشكل متكرر حتى تتقارب. وهو فعال بشكل خاص في تقسيم الصورة التي تحتوي على مناطق اهتمام متعددة تختلف تمامًا عن بعضها البعض.
# Clustering Segmentation def clustering(img): # Convert image to grayscale gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # Reshape the image Z = gray.reshape((-1, 3)) Z = np.float32(Z) # Define the criteria for k-means clustering criteria = (cv.TERM_CRITERIA_EPS cv.TERM_CRITERIA_MAX_ITER, 10, 1.0) # Set the number of clusters K = 2 # Perform k-means clustering _, label, center = cv.kmeans(Z, K, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS) # Convert the center values to uint8 center = np.uint8(center) # Reshape the result res = center[label.flatten()] res = res.reshape((gray.shape)) # Apply thresholding to the result _, res = cv.threshold(res, 0, 255, cv.THRESH_BINARY cv.THRESH_OTSU) return res
درجة درجة F1 هي مقياس يجمع بين الدقة والاستدعاء معًا لمقارنة صورة التجزئة المتوقعة مع صورة الحقيقة الأرضية. وهو الوسط التوافقي للدقة والتذكر، وهو مفيد في حالات الخلل الكبير في توازن البيانات، كما هو الحال في مجموعات بيانات التصوير الطبي.
قمنا بحساب درجة F1 لكل طريقة تجزئة من خلال تسطيح كل من الحقيقة الأرضية والصورة المجزأة وحساب درجة F1 الموزونة.
def calculate_f1_score(ground_image, segmented_image): ground_image = ground_image.flatten() segmented_image = segmented_image.flatten() return f1_score(ground_image, segmented_image, average="weighted")
قمنا بعد ذلك بتصور نتائج الفورمولا 1 بطرق مختلفة باستخدام مخطط شريطي بسيط:
على الرغم من ظهور العديد من الأساليب الحديثة لتجزئة الصور، إلا أن تقنيات التجزئة التقليدية مثل العتبة، واكتشاف الحواف، والأساليب القائمة على المنطقة، والتجميع يمكن أن تكون مفيدة جدًا عند تطبيقها على مجموعات البيانات مثل مجموعة بيانات الصور MIVIA HEp-2.
]كل طريقة لها قوتها:
من خلال تقييم هذه الأساليب باستخدام نتائج F1، نفهم المقايضات التي يتضمنها كل نموذج من هذه النماذج. قد لا تكون هذه الأساليب متطورة مثل ما تم تطويره في أحدث نماذج التعلم العميق، لكنها لا تزال سريعة وقابلة للتفسير وقابلة للاستخدام في نطاق واسع من التطبيقات.
شكرا على القراءة! آمل أن يكون هذا الاستكشاف لتقنيات تجزئة الصور التقليدية مصدر إلهام لمشروعك القادم. لا تتردد في مشاركة أفكارك وتجاربك في التعليقات أدناه!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3