LabelShapeStatisticFilter का उपयोग करके, मैं मूल छवि से रुचि के उन्मुख क्षेत्रों को सही ढंग से निकाल सकता हूं। मैं उन उन्मुख बाउंडिंग बॉक्स को मूल छवि पर प्लॉट करना चाहता हूं।
जब मैं GetOrientedBoundingBoxVertices() विधि के आउटपुट को देखने का प्रयास करता हूं, तो मुझे यह स्पष्ट नहीं है कि इन शिखरों को किस समन्वय प्रणाली में परिभाषित किया गया है। वे मूल छवि समन्वय प्रणाली में प्रतीत नहीं होते हैं।
मुझे विश्वास है कि मैं इस उत्कृष्ट नोटबुक का अनुसरण करते हुए लेबलशैपस्टैटिस्टिकफ़िल्टर वर्ग का उपयोग कर रहा हूँ (नीचे देखें), इस उत्कृष्ट नोटबुक का अनुसरण करते हुए: http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/Python_html/35_Segmentation_Shape_Analysis.html
bacteria_labels = shape_stats.GetLabels()
bacteria_volumes = [shape_stats.GetPhysicalSize(label) for label in bacteria_labels]
num_images = 5 # number of bacteria images we want to display
bacteria_labels_volume_sorted = [label for _,label in sorted(zip(bacteria_volumes, bacteria_labels))]
resampler = sitk.ResampleImageFilter()
aligned_image_spacing = [10,10,10] #in nanometers
for label in bacteria_labels_volume_sorted[0:num_images]:
aligned_image_size = [ int(ceil(shape_stats.GetOrientedBoundingBoxSize(label)[i]/aligned_image_spacing[i])) for i in range(3) ]
direction_mat = shape_stats.GetOrientedBoundingBoxDirection(label)
aligned_image_direction = [direction_mat[0], direction_mat[3], direction_mat[6],
direction_mat[1], direction_mat[4], direction_mat[7],
direction_mat[2], direction_mat[5], direction_mat[8] ]
resampler.SetOutputDirection(aligned_image_direction)
resampler.SetOutputOrigin(shape_stats.GetOrientedBoundingBoxOrigin(label))
resampler.SetOutputSpacing(aligned_image_spacing)
resampler.SetSize(aligned_image_size)
obb_img = resampler.Execute(img)
# Change the image axes order so that we have a nice display.
obb_img = sitk.PermuteAxes(obb_img,[2,1,0])
gui.MultiImageDisplay(image_list = [obb_img],
title_list = ["OBB_{0}".format(label)])
मैं इन बाउंडिंग बॉक्स को मूल छवि पर खींचने में सक्षम होने की उम्मीद करता हूं, लेकिन मुझे यकीन नहीं है कि कैसे।
अपडेट करें
शायद यह स्पष्ट कर सकता है कि मेरा क्या मतलब बेहतर है। पुन: नमूना उन्मुख बाउंडिंग बॉक्स, अपेक्षित के रूप में आउटपुट:
हालांकि, original_label_image.TransformPhysicalPointToContinousIndex() का उपयोग करने के बाद, मूल छवि स्थान में ओरिएंटेड बाउंडिंग बॉक्स बिंदु गलत दिखाई देते हैं (shape_stats.OrientedBoundingBoxVertices() मूल अनुक्रमणिका स्थान में):
अपडेट 2
Shape_stats.GetCentroid() का उपयोग करके, मैं सही ढंग से प्रत्येक लेबल के केन्द्रक के वास्तविक-विश्व निर्देशांक प्राप्त कर सकता हूं और उन्हें सही ढंग से प्लॉट कर सकता हूं:
यह भी प्रतीत होता है कि size_stats.GetOrientedBoundingBoxOrigin() का आउटपुट वास्तविक दुनिया के निर्देशांक में प्रशंसनीय है। Shape_stats.OrientedBoundingBoxVertices() का एक तत्व Shape_stats.GetOrientedBoundingBoxOrigin() से मेल खाता है।
2 जवाब
मेरा मानना है कि मैंने इसका पता लगा लिया है: उन्मुख बाउंडिंग बॉक्स कोने पूरी तरह से मूल छवि निर्देशांक में या बाउंडिंग बॉक्स के निर्देशांक में नहीं हैं।
ओरिएंटेड बाउंडिंग बॉक्स का मूल, shape_stats.GetOrientedBoundingBoxOrigin()
द्वारा लौटाया गया, मूल छवि विश्व-निर्देशांक में है। यह मूल ओरिएंटेड बाउंडिंग बॉक्स के एक शीर्ष से भी मेल खाता है।
ओरिएंटेड बाउंडिंग बॉक्स का प्रत्येक शीर्ष, shape_stats.OrientedBoundingBoxVertices()
द्वारा लौटाया जाता है, वास्तविक दुनिया के निर्देशांक में shape_stats.GetOrientedBoundingBoxDirection()
का उपयोग करके मूल के बारे में एक रोटेशन द्वारा पुनर्प्राप्त किया जा सकता है।
मुझे नहीं पता कि क्या शिखर का यह प्रतिनिधित्व जानबूझकर किया गया था, लेकिन यह पहली बार में मुझे भ्रमित कर रहा था (हालांकि मैं सिटक के लिए एक रिश्तेदार नवागंतुक हूं)।
शिखर भौतिक रिक्त स्थान में परिभाषित किए गए हैं, न कि अनुक्रमणिका स्थान। आपको छवि वर्ग के TransformPhysicslPointToIndex का उपयोग करने की आवश्यकता हो सकती है।