छवि में सममित क्षेत्र / पैटर्न खोजना


14

मेरे पास मानव पीठ की सतह के मध्य वक्रता का प्रतिनिधित्व करने वाली छवियों का एक सेट है।

मैं जो करना चाहता हूं, वह छवि उन बिंदुओं के लिए "स्कैन" करना है जो समान, छवि के कुछ अन्य भाग में "समकक्षों" को प्रतिबिंबित करते हैं (मिडलाइन के लिए सबसे अधिक सममित है, लेकिन जरूरी नहीं कि चूंकि विकृति हो सकती है)। कुछ छवि-सिलाई तकनीक छवियों के बीच समान बिंदुओं को "ऑटो-डिटेक्ट" करने के लिए इसका उपयोग करती हैं, लेकिन मैं उन्हें एक ही छवि के दोनों किनारों के लिए पता लगाना चाहता हूं।

अंतिम लक्ष्य एक निरंतर, सबसे अधिक घुमावदार, अनुदैर्ध्य रेखा को ढूंढना है जो कि सममित रूप से "आधा" में पीठ को विभाजित करता है।

एक नमूना छवि नीचे रखी गई है। ध्यान दें कि सभी क्षेत्र सममित नहीं हैं (विशेष रूप से, छवि के केंद्र के ऊपर, लाल ऊर्ध्वाधर "पट्टी" दाईं ओर भटकती है)। उस क्षेत्र को एक खराब स्कोर प्राप्त करना चाहिए, या जो भी हो, लेकिन फिर स्थानीय समरूपता को दूर रखे गए सममित बिंदुओं से परिभाषित किया जाएगा। किसी भी स्थिति में, मुझे अपने एप्लिकेशन डोमेन के लिए किसी भी एल्ग्रोथ्म को अनुकूलित करना होगा, लेकिन उसके बाद मैं कुछ सहसंबंध / दृढ़ संकल्प / पैटर्न-मिलान रणनीति हूं, पहले से ही आसपास कुछ होना चाहिए, मुझे लगता है।

(संपादित करें: नीचे कुछ और चित्र हैं, और कुछ और स्पष्टीकरण हैं)

यहाँ छवि विवरण दर्ज करें

संपादित करें: जैसा कि अनुरोध किया गया है, मैं और अधिक विशिष्ट छवियों को शामिल करूंगा, या तो अच्छी तरह से व्यवहार और समस्याग्रस्त। लेकिन रंगीन छवियों के बजाय, वे ग्रेस्केल वाले हैं, ताकि रंग सीधे डेटा परिमाण से संबंधित हो, जो रंगीन छवि के साथ नहीं हुआ (केवल संचार के लिए प्रदान किया गया)। हालांकि ग्रे छवियों को रंगीन एक की तुलना में कंट्रास्ट की कमी प्रतीत होती है, डेटा ग्रेडिएंट्स होते हैं और यदि वांछित हो तो कुछ अनुकूली कंट्रास्ट के साथ लाया जा सकता है।


1) एक बहुत ही सममित विषय की छवि:

यहाँ छवि विवरण दर्ज करें


2) एक ही पल में एक ही विषय की छवि। यद्यपि अधिक "सुविधाएँ" (अधिक ग्रेडिएंट) हैं, यह पहले की तरह "सममित" महसूस नहीं करता है:

यहाँ छवि विवरण दर्ज करें


3) एक पतली युवा विषय, उत्तलता के साथ उत्तलता (हल्के क्षेत्रों द्वारा चिह्नित), अधिक सामान्य अवतल midline के बजाय midline पर:

यहाँ छवि विवरण दर्ज करें


4) X-Ray द्वारा पुष्टि की गई रीढ़ की हड्डी में विचलन वाला एक युवा व्यक्ति (विषमताओं पर ध्यान दें):

यहाँ छवि विवरण दर्ज करें


5) विशिष्ट "झुका हुआ" विषय (हालांकि ज्यादातर घुमावदार मध्य रेखा के आसपास सममित है, और ठीक से "विकृत" नहीं है):

यहाँ छवि विवरण दर्ज करें


कोई मदद बहुत स्वागत है!


बस स्पाइन को डिवाइडर के रूप में क्यों नहीं इस्तेमाल किया जाता है?
जिम क्ले

@JimClay: मुझे संदेह है कि रीढ़ का हिस्सा मापा जा रहा है, बाकी की छवि की समरूपता के वास्तविक अक्ष के सापेक्ष
21

"कुछ छवि-सिलाई तकनीक छवियों के बीच" ऑटो-डिटेक्ट "समान बिंदुओं के लिए इसका उपयोग करती हैं" छवि की एक फ़्लिप प्रति बनाएं और फिर उनमें से एक का उपयोग करें। :)
21

क्या आप केवल वाई अक्ष के साथ छवि को दर्पण नहीं कर सकते हैं और पंजीकरण एल्गोरिथ्म का उपयोग कर सकते हैं? क्योंकि आपके द्वारा बनाए जा सकने वाले लचीले / गैरपारंपरिक पंजीकरण एल्गोरिदम पर पहले से ही बहुत सारे शोध हैं।
निकी एस्टनर

JimClay, रीढ़ वह है जो मैं खोजना चाहता हूं, मुझे नहीं पता कि यह कहां है; एंडोलिथ, मेरे सवाल में कुछ एल्गोरिदम के नाम बताने वाले लोग शामिल हैं, मुझे अभी तक कोई नहीं मिला। और निकी, यह पूरी बात है, लेकिन मैं उन एल्गोरिदम में से किसी को नहीं जानता, इसीलिए मैं सवाल पूछ रहा हूँ पहली बार में: ओ)
हेल्टनबाइकर

जवाबों:


9

जैसा कि मैंने टिप्पणियों में कहा है, चिकित्सा छवि पंजीकरण बहुत सारे शोध उपलब्ध हैं, और मैं विशेषज्ञ नहीं हूं। मैंने जो पढ़ा है, उसमें से जो मूल विचार आमतौर पर इस्तेमाल किया जाता है, वह है दो मैपिंग (आपके मामले में एक इमेज और उसकी मिरर इमेज) के बीच मैपिंग को परिभाषित करना, फिर स्मूथनेस के लिए एनर्जी टर्म्स को परिभाषित करना और अगर मैपिंग लागू होती है तो इमेज समानता के लिए। मानक (या कभी-कभी एप्लिकेशन-विशिष्ट) अनुकूलन तकनीकों का उपयोग करके इस मानचित्रण का अनुकूलन करें।

मैंने इसे प्रदर्शित करने के लिए Mathematica में एक त्वरित एल्गोरिदम को एक साथ हैक किया है। यह एक एल्गोरिथ्म नहीं है जिसे आपको एक चिकित्सा अनुप्रयोग में उपयोग करना चाहिए, केवल मूल विचारों का प्रदर्शन।

सबसे पहले, मैं आपकी छवि को लोड करता हूं, इसे दर्पण करता हूं और इन छवियों को छोटे ब्लॉकों में विभाजित करता हूं:

src = ColorConvert[Import["http://i.stack.imgur.com/jf709.jpg"], 
   "Grayscale"];
mirror = ImageReflect[src, Left -> Right];
blockSize = 30;
partsS = ImagePartition[src, {blockSize, blockSize}];
partsM = ImagePartition[mirror, {blockSize, blockSize}];
GraphicsGrid[partsS]

गणितज्ञ ग्राफिक्स

आम तौर पर, हम लगभग कठोर पंजीकरण करेंगे (उदाहरण के लिए कीपॉइंट या इमेज मोमेंट्स का उपयोग करके), लेकिन आपकी छवि लगभग केंद्रित है, इसलिए मैं इसे छोड़ दूंगा।

यदि हम एक ब्लॉक को देखते हैं और यह दर्पण-छवि समकक्ष है:

{partsS[[6, 10]], partsM[[6, 10]]}

गणितज्ञ ग्राफिक्स

हम देख सकते हैं कि वे समान हैं, लेकिन स्थानांतरित हो गए हैं। राशि और बदलाव की दिशा वह है जिसे हम जानने की कोशिश कर रहे हैं।

मैच की समानता को निर्धारित करने के लिए, मैं वर्गीय यूक्लिडियन दूरी का उपयोग कर सकता हूं:

ListPlot3D[
  ImageData[
   ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
    SquaredEuclideanDistance]]]

गणितज्ञ ग्राफिक्स

दुख की बात है कि इस डेटा का उपयोग करना सीधे तौर पर जितना मैंने सोचा था उससे अधिक कठिन था, इसलिए मैंने इसके बजाय एक 2 के क्रम सन्निकटन का उपयोग किया:

fitTerms = {1, x, x^2, y, y^2, x*y};

fit = Fit[
   Flatten[MapIndexed[{#2[[1]] - blockSize/2, #2[[2]] - 
        blockSize/2, #1} &, 
     ImageData[
      ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
       SquaredEuclideanDistance]], {2}], 1], fitTerms, {x, y}];

Plot3D[fit, {x, -25, 25}, {y, -25, 25}]

गणितज्ञ ग्राफिक्स

फ़ंक्शन वास्तविक सहसंबंध फ़ंक्शन के समान नहीं है, लेकिन यह पहले चरण के लिए पर्याप्त करीब है। आइए इसकी गणना प्रत्येक युग्म ब्लॉक के लिए करें:

distancesFit = MapThread[
   Function[{part, template},
    Fit[Flatten[
      MapIndexed[{#2[[2]] - blockSize/2, #2[[1]] - blockSize/2, #1} &,
        ImageData[
        ImageCorrelate[part, template, 
         SquaredEuclideanDistance]], {2}], 1], 
     fitTerms, {x, y}]], {partsM, partsS}, 2];

यह हमें अनुकूलन के लिए हमारा पहला ऊर्जा शब्द देता है:

variablesX = Array[dx, Dimensions[partsS]];
variablesY = Array[dy, Dimensions[partsS]];

matchEnergyFit = 
  Total[MapThread[#1 /. {x -> #2, y -> #3} &, {distancesFit, 
     variablesX, variablesY}, 2], 3];

variablesX/Yप्रत्येक ब्लॉक के लिए ऑफ़सेट शामिल हैं, और matchEnergyFitलागू किए गए ऑफ़सेट के साथ मूल छवि और प्रतिबिंबित छवि के बीच वर्गीय यूक्लिडियन अंतर को अनुमानित करता है।

अकेले इस ऊर्जा का अनुकूलन खराब परिणाम देगा (यदि यह बिल्कुल भी परिवर्तित हो)। हम यह भी चाहते हैं कि ऑफ़सेट सुचारू हो, जहां ब्लॉक समानता ऑफसेट के बारे में कुछ नहीं बताती है (जैसे एक सीधी रेखा के साथ या सफेद पृष्ठभूमि में)।

तो हम चिकनाई के लिए दूसरा ऊर्जा शब्द निर्धारित करते हैं:

smoothnessEnergy = Total[Flatten[
    {
     Table[
      variablesX[[i, j - 1]] - 2 variablesX[[i, j]] + 
       variablesX[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesX[[i - 1, j]] - 2 variablesX[[i, j]] + 
       variablesX[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}],
     Table[
      variablesY[[i, j - 1]] - 2 variablesY[[i, j]] + 
       variablesY[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesY[[i - 1, j]] - 2 variablesY[[i, j]] + 
       variablesY[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}]
     }^2]];

सौभाग्य से, विवश अनुकूलन में निर्मित है गणितज्ञ:

allVariables = Flatten[{variablesX, variablesY}];
constraints = -blockSize/3. < # < blockSize/3. & /@ allVariables;
initialValues = {#, 0} & /@ allVariables;
solution = 
  FindMinimum[{matchEnergyFit + 0.1 smoothnessEnergy, constraints}, 
   initialValues];

आइए देखें परिणाम:

grid = Table[{(j - 0.5)*blockSize - dx[i, j], (i - 0.5)*blockSize - 
      dy[i, j]}, {i, Length[partsS]}, {j, Length[partsS[[1]]]}] /. 
   solution[[2]];
Show[src, Graphics[
  {Red,
   Line /@ grid,
   Line /@ Transpose[grid]
   }]]

गणितज्ञ ग्राफिक्स

0.1कारक से पहले smoothnessEnergyसापेक्ष वजन चिकनाई ऊर्जा छवि मैच ऊर्जा अवधि के संबंध में प्राप्त करता है। ये विभिन्न भारों के परिणाम हैं:

गणितज्ञ ग्राफिक्स

संभावित सुधार:

  • जैसा मैंने कहा, पहले एक कठोर पंजीकरण करें। एक सफेद पृष्ठभूमि के साथ, सरल छवि क्षण-आधारित पंजीकरण ठीक काम करना चाहिए।
  • यह केवल एक कदम है। आप एक चरण में मिलने वाले ऑफसेट का उपयोग कर सकते हैं और उन्हें दूसरे चरण में सुधार सकते हैं, शायद एक छोटी खोज विंडो या छोटे ब्लॉक आकार के साथ
  • मैंने उन लेखों को पढ़ा है जहाँ वे बिना ब्लॉक के ऐसा करते हैं, लेकिन एक ऑफसेट प्रति पिक्सेल का अनुकूलन करते हैं।
  • विभिन्न चिकनाई कार्यों का प्रयास करें

उत्तर केवल मनोरंजन के लिए पढ़ने के लिए बहुत लंबा है, लेकिन अंतिम छवि बहुत ही सांकेतिक है: यह आश्चर्यजनक लग रहा है: D
पेनेलोप

यह उत्तर बहुत ज्ञानवर्धक था। मुझे इसे निगलने के लिए कुछ समय की आवश्यकता होगी, लेकिन सबसे गैर-कठोर पंजीकरण तकनीक वह है जो मुझे उपयोग करने की आवश्यकता होगी। सौभाग्य से आपने कुछ वैचारिक विवरण प्रदान किए, इसलिए सबसे खराब स्थिति में मैं कुछ इसी तरह के दृष्टिकोण का पता लगा सकता हूं। इस बीच, मैं अधिक छवियों के साथ प्रश्न को अपडेट करूंगा। अभी के लिए धन्यवाद!
हेलटनबीकर

4

दिलचस्प सवाल। सबसे पहले, हो सकता है कि आप इंटरेस्ट कीपर डिटेक्टर और मैचिंग के आधार पर अप्रोच करें। इसमें SIFT (स्केल-इनवेरिएंट फ़ीचर ट्रांसफ़ॉर्म), SURF, ORB, आदि शामिल होंगे ... या यहां तक ​​कि एक सरल तरीका हैरिस ऑपरेटर (csce.uark.edu/~jgauch/library/Features/Harris.1988.pdf पर आधारित होगा। )। यह आपके पोस्ट से स्पष्ट नहीं है कि आपने क्या प्रयास किया है, इसलिए मुझे खेद है अगर मैं यहां भोले बन रहा हूं।

कहा कि, मुझे केवल मजाक के लिए गणितीय आकृति विज्ञान (एमएम) के साथ एक सरल दृष्टिकोण लेने दें :) सभी चरणों के दृश्य के लिए छवियां अंत में हैं।

मैंने आपकी नमूना छवि ली और उसे L को b में बदल दिया * ImageMagick का उपयोग करते हुए कलर्सपेस और केवल L * बैंड का उपयोग किया:

convert x.jpg -colorspace Lab -separate %d.png

0.png L * बैंड से मेल खाती है। अब, मुझे यकीन है कि आपके पास वास्तविक छवि डेटा है, लेकिन मैं jpg संपीड़न कलाकृतियों के साथ काम कर रहा हूं और क्या नहीं। इस समस्या को आंशिक रूप से संभालने के लिए, मैंने एक रूपात्मक उद्घाटन किया जिसके बाद त्रिज्या का एक सपाट डिस्क के साथ एक रूपात्मक समापन होता है। यह एमएम के साथ शोर को कम करने का एक मूल तरीका है, और डिस्क त्रिज्या को देखते हुए बहुत अधिक छवि नहीं बदली जाती है। अगला मेरा विचार इस एकल छवि पर आधारित था, जिसमें अन्य मामलों के लिए असफल होने की काफी संभावना है। आपकी रुचि का क्षेत्र नेत्रहीन रूप से गहरा (आपकी रंग छवि में "हॉट्टर") होने के कारण प्रतिष्ठित है, इसलिए मेरा मानना ​​था कि सांख्यिकीय-आधारित दूरबीन अच्छा प्रदर्शन कर सकती है। मैंने ओट्सू के दृष्टिकोण का उपयोग किया, जो एक स्वचालित है।

इस बिंदु पर, ब्याज के मध्य क्षेत्र को स्पष्ट रूप से कल्पना करना संभव है। समस्या यह है कि, मेरे दृष्टिकोण में, मैं चाहता था कि यह एक बंद घटक हो लेकिन ऐसा नहीं है। मैं हर जुड़े घटक को त्यागने से शुरू करता हूं जो सबसे बड़े एक से छोटा है (उनमें से एक के रूप में पृष्ठभूमि की गिनती नहीं)। यह अन्य मामलों में काम करने का अधिक मौका है अगर बिनैराइजेशन परिणाम एक अच्छा था। आपकी उदाहरण छवि में, पृष्ठभूमि से जुड़ा एक घटक है, इसलिए इसे खारिज नहीं किया जाता है लेकिन यह समस्याओं का कारण नहीं बनता है।

यदि आप अभी भी मेरा अनुसरण कर रहे हैं, तो हमें अभी तक वास्तविक वास्तविक केंद्रीय क्षेत्र नहीं मिल रहा है। यहाँ इस पर मेरा टेक है। कोई फर्क नहीं पड़ता कि व्यक्ति कितना घुमावदार है (वास्तव में मैं कुछ समस्याग्रस्त मामलों को देख सकता हूं), यह क्षेत्र एक ऊर्ध्वाधर रेखा जैसा दिखता है। उस अंत तक, मैं 100 की लंबाई की ऊर्ध्वाधर रेखा के साथ एक रूपात्मक उद्घाटन करके वर्तमान छवि को सरल करता हूं। यह लंबाई पूरी तरह से मनमाना है, अगर आपके पास स्केलिंग मुद्दे नहीं हैं, तो यह निर्धारित करने के लिए एक कठिन मूल्य नहीं है। अब हम फिर से घटकों को छोड़ देते हैं, लेकिन मैं इस कदम पर थोड़ा अधिक सावधान था। मैंने छोटे क्षेत्रों पर विचार करने के लिए छवि के पूरक के साथ क्षेत्र का उद्घाटन किया, यह ग्रैनुलोमेट्रिक्स विश्लेषण (एमएम से भी) के रूप में कुछ प्रदर्शन करके अधिक नियंत्रित तरीके से किया जा सकता है।

हमारे पास मोटे तौर पर अब तीन टुकड़े हैं: छवि का बायां हिस्सा, केंद्रीय भाग और छवि का दायां हिस्सा। मध्य भाग में तीनों का छोटा घटक होने की उम्मीद है, इसलिए इसे तुच्छ रूप से प्राप्त किया जाता है।

यहाँ अंतिम परिणाम है, नीचे दाईं ओर की छवि अपने मूल के साथ बाईं ओर केवल सुपरपोज़्ड छवि है। व्यक्तिगत आंकड़े सभी संरेखित नहीं हैं, जल्दी के लिए खेद है।

http://i.imgur.com/XRhYv.png


अपनी तरह की रुचि के लिए बहुत बहुत धन्यवाद, लेकिन आपके दृष्टिकोण को मेरे डेटा के कुछ गुणों पर विचार करना चाहिए (शिकायत नहीं, बस एक विवरण): 1) वास्तविक डेटा फ़्लोट्स का एक 2 डी सरणी है, एक विचलन वाले लाल-पीले रंग के साथ- पाइथन के मेटप्लोटलिब में हरे रंग की कॉलॉर्मैप। मुझे नहीं लगता कि रंग डेटा के साथ काम करना वैचारिक रूप से सही होगा, छवियों को केवल संचार उद्देश्यों के लिए दिखाया गया है; 2) वास्तविक डेटा सतह वक्रता (उत्तल बनाम अवतल) से संबंधित है, जिसमें लाल भाग अवतल और हरे रंग के उत्तल होते हैं। सममित अक्ष आवश्यक रूप से अवतल क्षेत्र में नहीं पड़ता है।
हेल्टनबिकर

मैं बहुत जल्द कुछ और छवियां (और इस एक को बदल दूंगा) को ग्रेस्केल वाले के साथ जोड़ दूंगा, ताकि रंग के कारण गतिशील रेंज विरूपण के खतरे को समाप्त करने के लिए खुद छवियों का परीक्षण किया जा सके।
हेल्टनबिकर

डेटा अभी तक उपलब्ध नहीं है, दुर्भाग्य से। ग्रेस्केल की छवियां इसके सर्वश्रेष्ठ सन्निकटन हैं।
एमएमजीपी

मेरा मानना ​​है कि अनुमान शायद सबसे पर्याप्त है, लेकिन मुझे वास्तविक डेटा प्रदान करने में कोई आपत्ति नहीं है। मैं कुछ सार्वजनिक ड्रॉपबॉक्स डाउनलोड लिंक पोस्ट कर सकता हूं, बस यह नहीं पता है कि किस फ़ाइल प्रारूप में है।
हेलटनबीकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.