image महत म्युचुअल सूचना और दो छवियों की संयुक्त एंट्रोपी-MATLAB



एन्ट्रापी सूत्र (1)

मेरे पास दो काले और सफेद छवियाँ हैं और मुझे पारस्परिक जानकारी की गणना करने की आवश्यकता है I

Image 1 = X 
Image 2 = Y

मुझे पता है कि आपसी जानकारी को परिभाषित किया जा सकता है:

MI = entropy(X) + entropy(Y) - JointEntropy(X,Y)

एन्ट्रापी की गणना करने के लिए MATLAB पहले से ही अंतर्निहित फ़ंक्शन है, लेकिन संयुक्त एन्ट्रापी की गणना नहीं करने के लिए मुझे लगता है कि सच्चा सवाल यह है कि: मैं दो छवियों की संयुक्त एंट्रोपी की गणना कैसे करूं?

यहां उन चित्रों का एक उदाहरण है, जिन्हें मैं संयुक्त एंट्रोपी ढूंढना चाहता हूं:

X =

0    0    0    0    0    0
0    0    1    1    0    0
0    0    1    1    0    0
0    0    0    0    0    0
0    0    0    0    0    0

Y =

0    0    0    0    0    0 
0    0    0.38 0.82 0.38 0.04 
0    0    0.32 0.82 0.68 0.17
0    0    0.04 0.14 0.11 0 
0    0    0    0    0    0

https://code.i-harness.com


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

क्या महत्वपूर्ण है यह यह लॉग करता है कि हम इसी समान स्थान पर तीव्रता की जोड़ी कितनी बार देख चुके हैं। उदाहरण के लिए, यदि हमारे पास एक संयुक्त हिस्टोग्राम संख्या (7,3) = 2 , इसका मतलब है कि जब हम दोनों छवियों को स्कैन कर रहे थे, जब हम 7 की तीव्रता का सामना करते थे, दूसरी छवि में इसी इसी स्थान पर, हमने सामना किया कुल 2 बार के लिए 3 तीव्रता

एक संयुक्त हिस्टोग्राम का निर्माण करना बहुत सरल है

  1. सबसे पहले, एक 256 x 256 मैट्रिक्स बनाएं (यह मान लें कि आपकी छवि अहस्ताक्षरित 8-बिट पूर्णांक है) और इन्हें सभी शून्य पर आरंभ करें। साथ ही, आपको यह सुनिश्चित करने की ज़रूरत है कि आपकी दोनों छवियां समान आकार (चौड़ाई और ऊंचाई) हैं
  2. एक बार जब आप ऐसा करते हैं, तो प्रत्येक छवि के पहले पिक्सेल पर नज़र डालें, जिसे हम शीर्ष बाएं कोने के रूप में दर्शाएंगे। विशेष रूप से, इस स्थान पर पहली और दूसरी छवि के लिए तीव्रताएं देखें पहली छवि की तीव्रता पंक्ति के रूप में काम करेगी जबकि दूसरी छवि की तीव्रता स्तंभ के रूप में काम करेगी।
  3. मैट्रिक्स में इस स्थान को खोजें और मैट्रिक्स में इस स्थान को 1 से बढ़ाएं।
  4. अपनी छवि में शेष स्थानों के लिए इसे दोहराएं।
  5. आपके द्वारा पूरा कर लेने के बाद, सभी प्रविष्टियों को कुल चित्रों के दोनों चित्रों में विभाजित करें (याद रखें कि उन्हें समान आकार होना चाहिए)। इससे हमें दोनों छवियों के बीच संयुक्त संभावना वितरण मिलेगा।

एक यह करने के for loops के साथ करने के लिए इच्छुक होगा, लेकिन यह आमतौर पर जाना जाता है के रूप में, loops के लिए कुख्यात धीमी है और अगर संभव हो तो सभी से बचा जाना चाहिए। हालांकि, आप आसानी से बिना किसी लूप के MATLAB में निम्न तरीके से कर सकते हैं। मान लीजिए कि im1 और im2 आप की तुलना करना चाहते हैं पहली और दूसरी छवियाँ हैं। हम क्या कर सकते हैं वैक्टर में im1 और im2 को परिवर्तित करते हैं। फिर हम संयुक्त हिस्टोग्राम की गणना करने में हमारी मदद करने के लिए accumarray का उपयोग कर सकते हैं। accumarray में सबसे शक्तिशाली कार्यों में से एक है accumarray आप इसे एक लघु नक्शा रेड्यूस प्रतिमान के रूप में सोच सकते हैं। सीधे शब्दों में कहें, प्रत्येक डेटा इनपुट में एक कुंजी और एक संबद्ध मूल्य है। accumarray का लक्ष्य एक ही कुंजी से संबंधित सभी मूल्यों को बिन करना है और इन सभी मूल्यों पर कुछ कार्य करना है। हमारे मामले में, "कुंजी" तीव्रता का मूल्य होगा, और मूल्य स्वयं प्रत्येक तीव्रता मूल्य के लिए 1 के मूल्य हैं। हम तब 1 सभी मूल्यों को जोड़ना चाहते हैं जो एक ही बिन में मैप करता है, जो वास्तव में हम हिस्टोग्राम की गणना करते हैं। accumarray लिए डिफ़ॉल्ट व्यवहार इन सभी मूल्यों को जोड़ना है। विशेष रूप से, accumarray का उत्पादन एक सरणी होगा जहां प्रत्येक स्थिति उस कुंजी के लिए मैप किए गए सभी मानों की राशि की गणना करती है। उदाहरण के लिए, पहली स्थिति 1 के कुंजी के लिए मैप किए गए सभी मानों का योग होगा, दूसरी स्थिति उन सभी मानों का योग होगा जो 2 की कुंजी के साथ मैप की जाती हैं और इसी तरह।

हालांकि, संयुक्त हिस्टोग्राम के लिए, आप यह पता लगाना चाहते हैं कि किन मूल्यों में (i,j) की तीव्रता की जोड़ी को मैप किया जाता है, और इसलिए यहां की कुंजी 2 डी निर्देशांक की एक जोड़ी होगी। जैसे, पहली इमेज में किसी भी तीव्रता की तीव्रता है और दूसरी छवि में दूसरी छवि में एक ही स्थान पर दो छवियों के बीच साझा की जाती है, उसी कुंजी पर जाते हैं। इसलिए 2 डी मामले में, accumarray के उत्पादन में 2 डी मैट्रिक्स होगा, जहां प्रत्येक तत्व (i,j) में सभी मानों का योग होता है जो कुंजी (i,j) से accumarray , 1 डी मामले के समान, जो पहले उल्लेख किया गया था वास्तव में हम क्या कर रहे हैं।

दूसरे शब्दों में:

indrow = double(im1(:)) + 1;
indcol = double(im2(:)) + 1; %// Should be the same size as indrow
jointHistogram = accumarray([indrow indcol], 1);
jointProb = jointHistogram / numel(indrow);

accumarray साथ, पहला इनपुट कुंजी हैं और दूसरा इनपुट मूल्य हैं। accumarray साथ एक नोट यह है कि यदि प्रत्येक कुंजी का एक ही मान होता है, तो आप दूसरे इनपुट के लिए एक निरंतर असाइन कर सकते हैं, जो मैंने किया है और यह 1 । सामान्य तौर पर, यह एक सरणी है जिसमें पहले इनपुट के समान पंक्तियों की संख्या होती है। इसके अलावा, पहले दो पंक्तियों का विशेष ध्यान दें। अनिवार्य रूप से आपकी छवि में 0 तीव्रता होगी, लेकिन क्योंकि MATLAB 1 पर अनुक्रमण करना शुरू कर देता है, हमें 1 से दोनों सरणियों को ऑफसेट करने की आवश्यकता है

अब हमारे पास संयुक्त हिस्टोग्राम है, संयुक्त एन्ट्रापी की गणना करना वास्तव में सरल है यह 1 डी में एंटरपीपी के समान है, सिवाय अब तक हम पूरी संयुक्त संभावना मैट्रिक्स पर संक्षेप कर रहे हैं। ध्यान रखें कि यह बहुत संभावना होगी कि आपके संयुक्त हिस्टोग्राम में कई प्रविष्टियां होंगी। हमें यह सुनिश्चित करने की आवश्यकता है कि हम उन को छोड़ दें या log2 ऑपरेशन को अनिर्धारित किया जाएगा। अब किसी भी शून्य प्रविष्टियों से छुटकारा पाएं:

indNoZero = jointHistogram ~= 0;
jointProb1DNoZero = jointProb(indNoZero);

नोटिस लें कि मैंने संयुक्त संभावना मैट्रिक्स के बजाय संयुक्त हिस्टोग्राम खोज लिया। इसका कारण यह है कि संयुक्त हिस्टोग्राम में पूरी संख्या होती है, जबकि संयुक्त संभावना मैट्रिक्स 0 से 1 बीच स्थित होगा। विभाजन के कारण, मैं इस मैट्रिक्स में 0 के साथ किसी भी प्रविष्टि की गणना करना चाहता हूं क्योंकि संख्यात्मक गोल और अस्थिरता के कारण उपरोक्त हमारे संयुक्त संभाव्यता मैट्रिक्स को एक स्टैक्ड 1D वेक्टर में परिवर्तित कर देगा, जो ठीक है।

जैसे, संयुक्त एन्ट्रापी की गणना इस प्रकार की जा सकती है:

jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero));

यदि MATLAB में एक छवि के लिए एन्ट्रापी की गणना की मेरी समझ सही है, तो इसे हिस्टोग्राम / संभाव्यता वितरण की गणना 256 बिन्दूओं पर करनी चाहिए, ताकि आप उस फ़ंक्शन का उपयोग यहां संयुक्त एंट्रोपी के साथ कर सकें जो सिर्फ गणना की गई थी।

क्या होगा यदि हमारे पास अस्थायी पॉइंट डेटा है?

अब तक, हमने मान लिया है कि जिन छवियों के साथ आप निपटा चुके हैं वे तीव्रताएं हैं जो पूर्णांक-मूल्यवान हैं। यदि हमारे पास अस्थायी बिंदु डेटा है तो क्या होगा? accumarray यह मानता है कि आप पूर्णांकों का उपयोग करते हुए आउटपुट सरणी में अनुक्रमण करने की कोशिश कर रहे हैं, लेकिन हम अभी भी निश्चित रूप से पूरा कर सकते हैं कि हम सड़क में इस छोटी सी टक्कर के साथ क्या चाहते हैं। आप क्या करेंगे, ये दोनों छवियों में एक फ़्लोटिंग पॉइंट वैल्यू असाइन करते हैं जो कि एक अनन्य आईडी होती है । आप इस प्रकार इन ID के साथ accumarray प्रयोग करेंगे। निर्दिष्ट करने के लिए इस आईडी को सुविधाजनक बनाने के लिए, unique - विशेष रूप से फ़ंक्शन से तीसरे आउटपुट का उपयोग करें। आप प्रत्येक इमेज लेते हैं, उन्हें unique में डालते हैं और इनके लिए इंडेक्स को accumarray में निवेश करते हैं। दूसरे शब्दों में, इसके बजाय इसे करें:

[~,~,indrow] = unique(im1(:)); %// Change here
[~,~,indcol] = unique(im2(:)); %// Change here

%// Same code
jointHistogram = accumarray([indrow indcol], 1);
jointProb = jointHistogram / numel(indrow);
indNoZero = jointHistogram ~= 0;
jointProb1DNoZero = jointProb(indNoZero);
jointEntropy = -sum(jointProb1DNoZero.*log2(jointProb1DNoZero));

ध्यान दें कि indrow और indcol , हम इन चर के लिए सीधे unique के तीसरे आउटपुट को निर्दिष्ट करते हैं और फिर उसी संयुक्त एंटरपॉई कोड का उपयोग करते हैं जो हमने पहले की गणना की थी। हम भी 1 के रूप में चर को ऑफसेट नहीं करना है जैसा कि हमने पहले किया था क्योंकि unique 1 पर शुरू होने वाले आईडी निर्दिष्ट करेगा।

अलग

आप वास्तव में प्रत्येक छवि के लिए हिस्टोग्राम या संभावना वितरण की गणना कर सकते हैं संयुक्त रूप से संयुक्त संभावना मैट्रिक्स का उपयोग करते हुए। यदि आप पहली छवि के हिस्टोग्राम / संभाव्यता वितरण की गणना करना चाहते हैं, तो आप प्रत्येक पंक्ति के सभी स्तंभों को आसानी से जमा कर सकते हैं। दूसरी छवि के लिए ऐसा करने के लिए, आप प्रत्येक कॉलम के लिए बस सभी पंक्तियां एकत्र कर लेंगे। जैसे, आप ऐसा कर सकते हैं:

histogramImage1 = sum(jointHistogram, 1);
histogramImage2 = sum(jointHistogram, 2);

उसके बाद, आप इन दोनों के एन्ट्रापी की गणना अपने आप कर सकते हैं जांच को दोबारा करने के लिए, सुनिश्चित करें कि आप इन दोनों को पीडीएफ में बदल दें, फिर मानक समीकरण (ऊपर की तरह) का उपयोग कर एन्ट्रापी की गणना करें।

आखिर मैं म्युचुअल सूचना कैसे गणना करूं?

अंत में म्युचुअल जानकारी की गणना करने के लिए, आपको दो छवियों के एन्ट्रपीपी की आवश्यकता होगी। आप MATLAB का अंतर्निहित entropy फ़ंक्शन का उपयोग कर सकते हैं, लेकिन यह मानता है कि 256 अद्वितीय स्तर हैं। संभवतः आप इसे 256 के बजाय N अलग-अलग स्तरों के मामले में लागू करना चाहते हैं, और इसके बाद आप ऊपर दिए गए एक अलग कोड में प्रत्येक छवि के हिस्टोग्राम की गणना कर सकते हैं, और उसके बाद कंप्यूटिंग कर सकते हैं। प्रत्येक छवि के लिए एंट्रोपी आप केवल एन्ट्रापी गणना को दोहराते हैं जो संयुक्त रूप से उपयोग किया गया था, लेकिन व्यक्तिगत रूप से प्रत्येक छवि पर इसे लागू करें:

%// Find non-zero elements for first image's histogram
indNoZero = histogramImage1 ~= 0;

%// Extract them out and get the probabilities
prob1NoZero = histogramImage1(indNoZero) / numel(histogramImage1);

%// Compute the entropy
entropy1 = -sum(prob1NoZero.*log2(prob1NoZero));

%// Repeat for the second image
indNoZero = histogramImage2 ~= 0;
prob2NoZero = histogramImage2(indNoZero) / numel(histogramImage2);
entropy2 = -sum(prob2NoZero.*log2(prob2NoZero));

%// Now compute mutual information
mutualInformation = entropy1 + entropy2 - jointEntropy;

उम्मीद है की यह मदद करेगा!





information-theory