कर्नेल (छवि प्रसंस्करण): Difference between revisions

From Vigyanwiki
No edit summary
 
(11 intermediate revisions by 2 users not shown)
Line 2: Line 2:
{{other uses|कर्नेल (बहुविकल्पी)}}
{{other uses|कर्नेल (बहुविकल्पी)}}


[[ मूर्ति प्रोद्योगिकी | '''छवि प्रसंस्करण''']] में, कर्नेल, कन्वोल्यूशन मैट्रिक्स, या मास्क अल्प [[मैट्रिक्स (गणित)]] है जिसका उपयोग धुंधलापन, शार्पनिंग, एम्बॉसिंग, [[ किनारे का पता लगाना | एज डिटेक्शन]] और अधिक कुछ के लिए किया जाता है। यह कर्नेल और बिटमैप छवि के मध्य [[कनवल्शन]] करके पूर्ण किया जाता है। या अधिक सरलता से, जब आउटपुट छवि में प्रत्येक पिक्सेल इनपुट छवि में पास के पिक्सेल (स्वयं सहित) का फलन होता है, तो कर्नेल वह फलन होता है।
[[ मूर्ति प्रोद्योगिकी |'''इमेज प्रोसेसिंग''']] में, '''कर्नेल''', कन्वोल्यूशन मैट्रिक्स, या मास्क स्मॉल [[मैट्रिक्स (गणित)|मैट्रिक्स]] है जिसका उपयोग ब्लर्रिंग, शार्पनिंग, एम्बॉसिंग, [[ किनारे का पता लगाना |एज डिटेक्शन]] के लिए किया जाता है। यह कर्नेल और बिटमैप इमेज के मध्य [[कनवल्शन]] करके पूर्ण किया जाता है। या अधिक सरलता से, जब आउटपुट इमेज में प्रत्येक पिक्सेल इनपुट इमेज में पास के पिक्सेल का फंक्शन होता है, तो कर्नेल वह फंक्शन होता है।


== विवरण ==
== विवरण ==


कनवल्शन की सामान्य अभिव्यक्ति है
कनवल्शन की सामान्य अभिव्यक्ति है:


<math>g(x,y)= \omega *f(x,y)=\sum_{dx=-a}^a{\sum_{dy=-b}^b{ \omega (dx,dy)f(x-dx,y-dy)}},</math>
जहाँ <math>g(x,y)= \omega *f(x,y)=\sum_{dx=-a}^a{\sum_{dy=-b}^b{ \omega (dx,dy)f(x-dx,y-dy)}},</math> <math>g(x,y)</math> फ़िल्टर की गई इमेज है, <math>f(x,y)
कहाँ <math>g(x,y)</math> फ़िल्टर की गई छवि है, <math>f(x,y)
</math> मूल इमेज है, <math>\omega</math> फ़िल्टर कर्नेल है, फ़िल्टर कर्नेल के प्रत्येक एलिमेंट पर विचार किया जाता है  <math>-a \leq dx \leq a </math> और <math>-b \leq dy \leq b</math>.
</math> मूल छवि है, <math>\omega</math> फ़िल्टर कर्नेल है. फ़िल्टर कर्नेल के प्रत्येक तत्व पर विचार किया जाता है  <math>-a \leq dx \leq a </math> और <math>-b \leq dy \leq b</math>.


तत्व मानों के आधार पर, कर्नेल कई प्रकार के प्रभाव पैदा कर सकता है:
एलिमेंट वैल्यूज के आधार पर, कर्नेल कई प्रकार के प्रभाव उत्पन्न कर सकता है:


{| class="wikitable"
{| class="wikitable"
|-
|-
! Operation
! आपरेशन
! Kernel ω  
! कर्नेल ω  
! Image result g(x,y)
! इमेज रिजल्ट g(x,y)
|-
|-
|'''[[Identity operation|Identity]]'''
|'''[[Identity operation|आइडेंटिटी]]'''
| align="center" |<math>
| align="center" |<math>
\begin{bmatrix}
\begin{bmatrix}
Line 30: Line 29:
|[[File:Vd-Orig.png]]
|[[File:Vd-Orig.png]]
|-
|-
| rowspan="2" |'''[[Ridge detection|Ridge]]''' or '''[[edge detection]]'''
| rowspan="2" |'''[[Ridge detection|रिज]]''' या '''[[edge detection|एज डिटेक्शन]]'''
| align="center" |<math>
| align="center" |<math>
\begin{bmatrix}
\begin{bmatrix}
Line 49: Line 48:
|[[File:Vd-Rige2.png]]
|[[File:Vd-Rige2.png]]
|-
|-
|'''Sharpen'''
|'''शार्पन'''
| align="center" |<math>
| align="center" |<math>
\begin{bmatrix}
\begin{bmatrix}
Line 59: Line 58:
|[[File:Vd-Sharp.png]]
|[[File:Vd-Sharp.png]]
|-
|-
|'''[[Box blur]]''' <br> <small>([[Normalization (image processing)|normalized]])</small>
|'''[[Box blur|बॉक्स ब्लर]]''' <br> <small>([[Normalization (image processing)|सामान्यीकृत)]])</small>
| align="center" |<math>
| align="center" |<math>
\frac{1}{9}
\frac{1}{9}
Line 70: Line 69:
|[[File:Vd-Blur2.png]]
|[[File:Vd-Blur2.png]]
|-
|-
|'''[[Gaussian blur]] 3 × 3''' <br> <small>(approximation)</small>
|'''[[Gaussian blur|गॉसियन ब्लर्रिंग]] 3 × 3''' <br> <small>(अनुमान)</small>
| align="center" |<math>
| align="center" |<math>
\frac{1}{16}
\frac{1}{16}
Line 81: Line 80:
|[[File:Vd-Blur1.png]]
|[[File:Vd-Blur1.png]]
|-
|-
|'''[[Gaussian blur]] 5 × 5''' <br> <small>(approximation)</small>
|'''[[Gaussian blur|गाऊसी ब्लर्रिंग]] 5 × 5''' <br> <small>(अनुमान)</small>
| align="center" |<math>
| align="center" |<math>
\frac{1}{256}
\frac{1}{256}
Line 94: Line 93:
|[[File:Vd-Blur_Gaussian_5x5.png]]
|[[File:Vd-Blur_Gaussian_5x5.png]]
|-
|-
|'''[[Unsharp masking]] 5 × 5''' <br>Based on Gaussian blur <br> with amount as 1 and <br> threshold as 0<br> <small>(with no [[image mask]])</small>
|'''[[Unsharp masking|अनशार्प मास्किंग]] 5 × 5''' <br>गॉसियन ब्लर पर आधारित 1 और के रूप में अमाउंट के साथ
सीमा 0 के रूप में<br> <small>(बिना किसी [[image mask|इमेज मास्क]] के)</small>
| align="center" |<math>
| align="center" |<math>
\frac{-1}{256}
\frac{-1}{256}
Line 115: Line 115:
|-
|-
|}
|}
उपरोक्त गुठली और छवियों को संयोजित करके प्राप्त किए जाने वाले प्रभावों के कुछ उदाहरण हैं।
उपरोक्त कर्नेल और इमेजे को संयोजित करके प्राप्त किए जाने वाले प्रभावों के कुछ उदाहरण हैं।


=== उत्पत्ति ===
=== ओरिजिन ===


मूल कर्नेल की स्थिति है जो वर्तमान आउटपुट पिक्सेल से ऊपर (वैचारिक रूप से) है। यह वास्तविक कर्नेल के बाहर हो सकता है, हालाँकि आमतौर पर यह कर्नेल तत्वों में से से मेल खाता है। सममित कर्नेल के लिए, मूल आमतौर पर केंद्र तत्व होता है।
मूल कर्नेल की स्थिति है, जो वर्तमान आउटपुट पिक्सेल से ऊपर (वैचारिक रूप से) है। यह रियल कर्नेल के बाहर हो सकता है, चूंकि सामान्यतः यह कर्नेल एलिमेंट्स में से एक के समान है। सिमेट्रिक कर्नेल के लिए, मूल सामान्यतः केंद्र एलिमेंट होता है।


== कनवल्शन ==
== कनवल्शन ==
{{see also|Symmetric convolution}}
{{see also|सिमेट्रिक कनवल्शन}}


[[File:2D Convolution Animation.gif|thumb|right|2डी कन्वोल्यूशन एनीमेशन]]कनवल्शन छवि के प्रत्येक तत्व को उसके स्थानीय पड़ोसियों के साथ जोड़ने की प्रक्रिया है, जिसे कर्नेल द्वारा भारित किया जाता है। यह कन्वोल्यूशन के रूप से संबंधित है। [[हैडामर्ड उत्पाद (मैट्रिसेस)]] का प्रदर्शन किया जा रहा है - कन्वोल्यूशन - पारंपरिक मैट्रिक्स गुणन नहीं है, इसके समान * द्वारा निरूपित होने के बावजूद।
[[File:2D Convolution Animation.gif|thumb|right|2D कन्वोल्यूशन एनीमेशन]]कनवल्शन इमेज के प्रत्येक एलिमेंट को उसके लोकल नेबर के साथ जोड़ने की प्रक्रिया है, जिसे कर्नेल द्वारा वेट किया जाता है। यह कन्वोल्यूशन के रूप से संबंधित है। * द्वारा निरूपित होने के पश्चात भी डेनोटे किया जा रहा [[हैडामर्ड उत्पाद (मैट्रिसेस)|मैट्रिक्स ऑपरेशन]] - कन्वोल्यूशन - मैट्रिक्स मल्टिप्लिकेशन नहीं है।


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


<math display=block>
<math display=block>
Line 144: Line 144:
(i \cdot 1)+(h \cdot 2)+(g \cdot 3)+(f \cdot 4)+(e \cdot 5)+(d \cdot 6)+(c \cdot 7)+(b \cdot 8)+(a \cdot 9).
(i \cdot 1)+(h \cdot 2)+(g \cdot 3)+(f \cdot 4)+(e \cdot 5)+(d \cdot 6)+(c \cdot 7)+(b \cdot 8)+(a \cdot 9).
</math>
</math>
अन्य प्रविष्टियों को समान रूप से भारित किया जाएगा, जहां हम छवि के प्रत्येक सीमा बिंदु पर कर्नेल के केंद्र को रखते हैं, और भारित योग की गणना करते हैं।
अन्य एंट्रीज को समान रूप से वेट किया जाएगा, जहां हम इमेज के प्रत्येक सीमा बिंदु पर कर्नेल के केंद्र को रखते हैं, और वेट योग की गणना करते हैं।


आउटपुट छवि में दिए गए पिक्सेल के मानों की गणना प्रत्येक कर्नेल मान को संबंधित इनपुट छवि पिक्सेल मानों से गुणा करके की जाती है। इसे निम्नलिखित छद्म कोड के साथ एल्गोरिदमिक रूप से वर्णित किया जा सकता है:
आउटपुट इमेज में दिए गए पिक्सेल के वैल्यूज की गणना प्रत्येक कर्नेल वैल्यू को संबंधित इनपुट इमेज पिक्सेल वैल्यूज से गुणा करके की जाती है। इसे निम्नलिखित सूडो कोड के साथ एल्गोरिदमिक रूप से डिस्क्राइब किया जा सकता है:


  ''इनपुट छवि'' में प्रत्येक ''छवि पंक्ति'' के लिए:
  '''for each''' ''image row'' '''in''' ''input image'':
     ''छवि पंक्ति'' में प्रत्येक ''पिक्सेल'' के लिए:
     '''for each''' ''pixel'' '''in''' ''image row'':
   
   
         ''संचायक'' को शून्य पर सेट करें
         '''set''' ''accumulator'' to zero
   
   
         ''कर्नेल'' में प्रत्येक ''कर्नेल पंक्ति'' के लिए:
         '''for each''' ''kernel row'' '''in''' ''kernel'':
             ''कर्नेल पंक्ति'' में प्रत्येक ''तत्व'' के लिए:
             '''for each''' ''element'' '''in''' ''kernel row'':
   
   
                 यदि ''तत्व स्थिति'' ''पिक्सेल स्थिति'' के अनुरूप* है तो
                 '''if''' ''element position''  corresponding* to ''pixel position'' '''then'''
                     ''तत्व मान'' को ''पिक्सेल मान'' से गुणा करें
                     '''multiply''' ''element value''  corresponding* to ''pixel value''
                     ''संचायक'' में ''परिणाम'' जोड़ें
                     '''add''' ''result'' to ''accumulator''
                 अगर अंत
                 '''endif'''
   
   
          ''आउटपुट छवि पिक्सेल'' को ''संचायक'' पर सेट करें
'''set''' ''output image pixel'' to ''accumulator''
       


:<nowiki>*</nowiki>संबंधित इनपुट छवि पिक्सेल कर्नेल की उत्पत्ति के सापेक्ष पाए जाते हैं।
:<nowiki>*</nowiki>संबंधित इनपुट इमेज पिक्सेल कर्नेल की उत्पत्ति के सापेक्ष पाए जाते हैं।


यदि कर्नेल सममित है तो कर्नेल के केंद्र (मूल) को वर्तमान पिक्सेल पर रखें। कर्नेल मूल के आस-पास के पड़ोसी पिक्सेल को ओवरलैप करेगा। प्रत्येक कर्नेल तत्व को उस पिक्सेल मान से गुणा किया जाना चाहिए जिसके साथ यह ओवरलैप होता है और सभी प्राप्त मानों का योग किया जाना चाहिए। यह परिणामी योग वर्तमान में कर्नेल के केंद्र के साथ ओवरलैप किए गए वर्तमान पिक्सेल के लिए नया मान होगा।
यदि कर्नेल सिमेट्रिक है, तो कर्नेल के केंद्र (मूल) को वर्तमान पिक्सेल पर रखें। कर्नेल मूल के आस-पास के पड़ोसी पिक्सेल को ओवरलैप करेगा। प्रत्येक कर्नेल एलिमेंट को उस पिक्सेल वैल्यू से गुणा किया जाना चाहिए जिसके साथ यह ओवरलैप होता है और सभी प्राप्त वैल्यूज का योग किया जाना चाहिए। यह परिणामी योग वर्तमान में कर्नेल के केंद्र के साथ ओवरलैप किए गए वर्तमान पिक्सेल के लिए नया वैल्यू होगा।


यदि कर्नेल सममित नहीं है, तो उपरोक्त के अनुसार कनवल्शन की गणना करने से पहले इसे क्षैतिज और ऊर्ध्वाधर अक्ष के चारों ओर फ़्लिप करना होगा।<ref>{{cite web | url=http://www.songho.ca/dsp/convolution/convolution2d_example.html | title=Example of 2D Convolution }}</ref>
यदि कर्नेल सिमेट्रिक नहीं है, तो उपरोक्त के अनुसार कनवल्शन की गणना करने से पूर्व इसे क्षैतिज और ऊर्ध्वाधर अक्ष के चारों ओर फ़्लिप करना होगा।<ref>{{cite web | url=http://www.songho.ca/dsp/convolution/convolution2d_example.html | title=Example of 2D Convolution }}</ref>
मैट्रिक्स कनवल्शन का सामान्य रूप है


<math display=block>
मैट्रिक्स कनवल्शन का सामान्य रूप है:
 
<math display="block">
\begin{bmatrix}                                                                   
\begin{bmatrix}                                                                   
   x_{11}      & x_{12} & \cdots  & x_{1n} \\                                     
   x_{11}      & x_{12} & \cdots  & x_{1n} \\                                     
Line 186: Line 188:
= \sum^{m-1}_{i=0} \sum^{n-1}_{j=0}                                               
= \sum^{m-1}_{i=0} \sum^{n-1}_{j=0}                                               
   x_{(m-i)(n-j)} y_{(1+i)(1+j)}
   x_{(m-i)(n-j)} y_{(1+i)(1+j)}
</math>'''एज हैंडलिंग'''[[File:Extend Edge-Handling.png|thumb|एज-हैंडलिंग बढ़ाएँ]]कर्नेल कनवल्शन के लिए आमतौर पर छवि सीमाओं के बाहर पिक्सेल से मान की आवश्यकता होती है। छवि किनारों को संभालने के लिए कई प्रकार की विधियाँ हैं।
</math>'''एज हैंडलिंग'''[[File:Extend Edge-Handling.png|thumb|एज-हैंडलिंग बढ़ाएँ]]कर्नेल कनवल्शन के लिए सामान्यतः इमेज सीमाओं के बाहर पिक्सेल से वैल्यू की आवश्यकता होती है। इमेज इमेज को संभालने के लिए कई प्रकार की विधियाँ हैं।


; बढ़ाना
; एक्सटेंड
: कनवल्शन के लिए मान प्रदान करने के लिए जहां तक ​​आवश्यक हो, निकटतम बॉर्डर पिक्सल को वैचारिक रूप से बढ़ाया जाता है। कॉर्नर पिक्सल को 90° वेजेज में बढ़ाया गया है। अन्य किनारे वाले पिक्सेल लाइनों में विस्तारित हैं।
: कनवल्शन के लिए वैल्यू प्रदान करने के लिए निकटतम सीमा पिक्सेल को जहाँ तक आवश्यक हो बढ़ाया जाता है। कॉर्नर पिक्सल को 90° वेजेज में बढ़ाया गया है। अन्य एज वाले पिक्सेल लाइनों में विस्तारित हैं।
; लपेटना
; व्रैप
:छवि वैचारिक रूप से लपेटी गई है (या टाइल की गई है) और मान विपरीत किनारे या कोने से लिए गए हैं।
:इमेज वैचारिक रूप से धारण की गई है (या टाइल की गई है) और वैल्यू विपरीत एज या कोने से लिए गए हैं।
; आईना
; मिरर
: छवि वैचारिक रूप से किनारों पर प्रतिबिंबित होती है। उदाहरण के लिए, किनारे के बाहर पिक्सेल 3 इकाइयों को पढ़ने का प्रयास करने पर इसके बजाय किनारे के अंदर 3 इकाइयों को पढ़ता है।
: इमेज वैचारिक रूप से इमेज पर प्रतिबिंबित होती है। उदाहरण के लिए, एज के बाहर पिक्सेल 3 यूनिट्स को लर्निंग का प्रयत्न करने पर इसके अतिरिक्त एज के अंदर 3 यूनिट्स को पढ़ता है।
; क्रॉप करें/ओवरलैप से बचें
; क्रॉप करें/ओवरलैप से बचें
: आउटपुट छवि में कोई भी पिक्सेल जिसे किनारे से परे मानों की आवश्यकता होती है उसे छोड़ दिया जाता है। इस विधि के परिणामस्वरूप आउटपुट छवि थोड़ी छोटी हो सकती है, किनारों को काट दिया गया है। कर्नेल को स्थानांतरित करें ताकि छवि के बाहर से मानों की कभी भी आवश्यकता न हो। मशीन लर्निंग मुख्य रूप से इस दृष्टिकोण का उपयोग करती है। उदाहरण: कर्नेल आकार 10x10, छवि आकार 32x32, परिणाम छवि 23x23 है।
: आउटपुट इमेज में कोई भी पिक्सेल जिसे एज से बियॉन्ड वैल्यूज की आवश्यकता होती है, उसे त्याग दिया जाता है। इस विधि के परिणामस्वरूप आउटपुट इमेज स्मॉल हो सकती है, इमेज को क्रॉप कर दिया गया है। कर्नेल को स्थानांतरित करें जिससे इमेज के बाहर से वैल्यूज की आवश्यकता न हो। मशीन लर्निंग मुख्य रूप से इस एप्रोच का उपयोग करती है। उदाहरण: कर्नेल आकार 10x10, इमेज आकार 32x32, परिणाम इमेज 23x23 है।
; गिरी फसल
; कर्नेल क्रॉप
: कर्नेल में कोई भी पिक्सेल जो इनपुट छवि से आगे बढ़ता है, उसका उपयोग नहीं किया जाता है और क्षतिपूर्ति के लिए सामान्यीकरण को समायोजित किया जाता है।
: कर्नेल में कोई भी पिक्सेल जो इनपुट इमेज से आगे बढ़ता है, उसका उपयोग नहीं किया जाता है और कम्पनसेट करने के लिए नॉर्मलाइजेशन को समायोजित किया जाता है।
; स्थिर
; कांस्टेंट
: छवि के बाहर पिक्सेल के लिए स्थिर मान का उपयोग करें। आमतौर पर काले या कभी-कभी भूरे रंग का प्रयोग किया जाता है। आम तौर पर यह आवेदन पर निर्भर करता है।
: इमेज के बाहर पिक्सेल के लिए कांस्टेंट वैल्यू का उपयोग करें। सामान्यतः काले या कभी-कभी भूरे रंग का प्रयोग किया जाता है। सामान्यतः यह एप्लीकेशन पर निर्भर करता है।


=== सामान्यीकरण ===
=== नॉर्मलाइजेशन ===


सामान्यीकरण को सभी कर्नेल तत्वों के योग द्वारा कर्नेल में प्रत्येक तत्व के विभाजन के रूप में परिभाषित किया गया है, ताकि सामान्यीकृत कर्नेल के तत्वों का योग ता हो। यह सुनिश्चित करेगा कि संशोधित छवि में औसत पिक्सेल मूल छवि में औसत पिक्सेल जितना उज्ज्वल हो।
नॉर्मलाइजेशन को सभी कर्नेल एलिमेंट्स के योग द्वारा कर्नेल में प्रत्येक एलिमेंट के विभाजन के रूप में परिभाषित किया गया है, जिससे सामान्यीकृत कर्नेल के एलिमेंट्स का योग यूनिटी हो। यह सुनिश्चित करेगा कि मॉडिफाइड इमेज में औसत पिक्सेल मूल इमेज में औसत पिक्सेल जितना ब्राइट हो।


===अनुकूलन===
===ऑप्टिमिसेशन===
तेज़ कनवल्शन एल्गोरिदम में शामिल हैं:<ref>[https://towardsdatascience.com/how-are-convolutions-actually-performed-under-the-hood-226523ce7fbf How Are Convolutions Actually Performed Under the Hood? 2 simple tricks that PyTorch & TensorFlow use to speed up convolutions by Anirudh Shenoy Dec 13, 2019]</ref>
तीव्र कनवल्शन एल्गोरिदम में सम्मिलित हैं:<ref>[https://towardsdatascience.com/how-are-convolutions-actually-performed-under-the-hood-226523ce7fbf How Are Convolutions Actually Performed Under the Hood? 2 simple tricks that PyTorch & TensorFlow use to speed up convolutions by Anirudh Shenoy Dec 13, 2019]</ref>
* वियोज्य कनवल्शन
* सेपरेबल कनवल्शन


====वियोज्य कनवल्शन====
====सेपरेबल कनवल्शन====
एम × एन कर्नेल के साथ 2डी कनवल्शन के लिए प्रत्येक नमूने (पिक्सेल) के लिए एम × एन गुणन की आवश्यकता होती है। यदि कर्नेल अलग करने योग्य है, तो गणना को एम + एन गुणन तक कम किया जा सकता है। अलग-अलग कनवल्शन का उपयोग करने से  2डी कनवल्शन के बजाय दो बार 1डी कनवल्शन करके गणना में काफी कमी आ सकती है।<ref>{{Cite web |title=कनवल्शन|url=https://www.songho.ca/dsp/convolution/convolution.html |access-date=2022-11-19 |website=www.songho.ca}}</ref>
''M'' × ''N'' कर्नेल के साथ 2D कनवल्शन के लिए प्रत्येक नमूने (पिक्सेल) के लिए ''M'' × ''N'' मल्टिप्लिकेशन की आवश्यकता होती है। यदि कर्नेल सेपरेबल है, तो गणना को ''M'' + ''N'' मल्टिप्लिकेशन तक कम किया जा सकता है। भिन्न-भिन्न कनवल्शन का उपयोग करने से  2D कनवल्शन के अतिरिक्त दो बार 1D कनवल्शन करके गणना में अत्यधिक कमी आ सकती है।<ref>{{Cite web |title=कनवल्शन|url=https://www.songho.ca/dsp/convolution/convolution.html |access-date=2022-11-19 |website=www.songho.ca}}</ref>


'''कार्यान्वयन'''
'''इम्प्लीमेंटेशन'''


यहां [[ ओपनजीएल शेडिंग भाषा ]] शेडिंग लैंग्वेज के साथ ठोस कनवल्शन कार्यान्वयन किया गया है:<syntaxhighlight lang="glsl">
यहां [[ ओपनजीएल शेडिंग भाषा |जीएलएसएल शेडिंग लैंग्वेज]] शेडिंग लैंग्वेज के साथ ठोस कनवल्शन इम्प्लीमेंटेशन किया गया है:<syntaxhighlight lang="glsl">
// author : csblo
// author : csblo
// Work made just by consulting :
// Work made just by consulting :
Line 316: Line 318:
== यह भी देखें ==
== यह भी देखें ==
* कनवल्शन
* कनवल्शन
* [[बहुआयामी असतत कनवल्शन]]
* [[बहुआयामी असतत कनवल्शन|मल्टीडाइमेंशनल डिस्कंटीन्यूअस कनवल्शन]]


== बाहरी संबंध ==
== बाहरी संबंध ==
Line 330: Line 332:
[[Category: Machine Translated Page]]
[[Category: Machine Translated Page]]
[[Category:Created On 10/08/2023]]
[[Category:Created On 10/08/2023]]
[[Category:Vigyan Ready]]

Latest revision as of 22:19, 2 February 2024

इमेज प्रोसेसिंग में, कर्नेल, कन्वोल्यूशन मैट्रिक्स, या मास्क स्मॉल मैट्रिक्स है जिसका उपयोग ब्लर्रिंग, शार्पनिंग, एम्बॉसिंग, एज डिटेक्शन के लिए किया जाता है। यह कर्नेल और बिटमैप इमेज के मध्य कनवल्शन करके पूर्ण किया जाता है। या अधिक सरलता से, जब आउटपुट इमेज में प्रत्येक पिक्सेल इनपुट इमेज में पास के पिक्सेल का फंक्शन होता है, तो कर्नेल वह फंक्शन होता है।

विवरण

कनवल्शन की सामान्य अभिव्यक्ति है:

जहाँ फ़िल्टर की गई इमेज है, मूल इमेज है, फ़िल्टर कर्नेल है, फ़िल्टर कर्नेल के प्रत्येक एलिमेंट पर विचार किया जाता है और .

एलिमेंट वैल्यूज के आधार पर, कर्नेल कई प्रकार के प्रभाव उत्पन्न कर सकता है:

आपरेशन कर्नेल ω इमेज रिजल्ट g(x,y)
आइडेंटिटी Vd-Orig.png
रिज या एज डिटेक्शन Vd-Rige1.png
Vd-Rige2.png
शार्पन Vd-Sharp.png
बॉक्स ब्लर
(सामान्यीकृत))
Vd-Blur2.png
गॉसियन ब्लर्रिंग 3 × 3
(अनुमान)
Vd-Blur1.png
गाऊसी ब्लर्रिंग 5 × 5
(अनुमान)
Vd-Blur Gaussian 5x5.png
अनशार्प मास्किंग 5 × 5
गॉसियन ब्लर पर आधारित 1 और के रूप में अमाउंट के साथ

सीमा 0 के रूप में
(बिना किसी इमेज मास्क के)




Vd-Unsharp 5x5.png

उपरोक्त कर्नेल और इमेजे को संयोजित करके प्राप्त किए जाने वाले प्रभावों के कुछ उदाहरण हैं।

ओरिजिन

मूल कर्नेल की स्थिति है, जो वर्तमान आउटपुट पिक्सेल से ऊपर (वैचारिक रूप से) है। यह रियल कर्नेल के बाहर हो सकता है, चूंकि सामान्यतः यह कर्नेल एलिमेंट्स में से एक के समान है। सिमेट्रिक कर्नेल के लिए, मूल सामान्यतः केंद्र एलिमेंट होता है।

कनवल्शन

2D कन्वोल्यूशन एनीमेशन

कनवल्शन इमेज के प्रत्येक एलिमेंट को उसके लोकल नेबर के साथ जोड़ने की प्रक्रिया है, जिसे कर्नेल द्वारा वेट किया जाता है। यह कन्वोल्यूशन के रूप से संबंधित है। * द्वारा निरूपित होने के पश्चात भी डेनोटे किया जा रहा मैट्रिक्स ऑपरेशन - कन्वोल्यूशन - मैट्रिक्स मल्टिप्लिकेशन नहीं है।

उदाहरण के लिए, यदि हमारे पास दो थ्री-बाय-थ्री मैट्रिक्स हैं, प्रथम कर्नेल, और दूसरा इमेज अंश, कनवल्शन कर्नेल की दोनों रोस और कॉलम्स को फ़्लिप करने और लोकली समान एंट्रीज और योग को गुणा करने की प्रक्रिया है। परिणामी इमेज के कोऑर्डिनेट्स [2, 2] (अर्थात, सेंट्रल एलिमेंट) पर एलिमेंट इमेज मैट्रिक्स की सभी एंट्रीज का वेट संयोजन होगा, जिसमें कर्नेल द्वारा दिए गए वजन होंगे:

अन्य एंट्रीज को समान रूप से वेट किया जाएगा, जहां हम इमेज के प्रत्येक सीमा बिंदु पर कर्नेल के केंद्र को रखते हैं, और वेट योग की गणना करते हैं।

आउटपुट इमेज में दिए गए पिक्सेल के वैल्यूज की गणना प्रत्येक कर्नेल वैल्यू को संबंधित इनपुट इमेज पिक्सेल वैल्यूज से गुणा करके की जाती है। इसे निम्नलिखित सूडो कोड के साथ एल्गोरिदमिक रूप से डिस्क्राइब किया जा सकता है:

for each image row in input image:
    for each pixel in image row:

        set accumulator to zero

        for each kernel row in kernel:
            for each element in kernel row:

                if element position  corresponding* to pixel position then
                    multiply element value  corresponding* to pixel value
                    add result to accumulator
                endif

set output image pixel to accumulator
        
*संबंधित इनपुट इमेज पिक्सेल कर्नेल की उत्पत्ति के सापेक्ष पाए जाते हैं।

यदि कर्नेल सिमेट्रिक है, तो कर्नेल के केंद्र (मूल) को वर्तमान पिक्सेल पर रखें। कर्नेल मूल के आस-पास के पड़ोसी पिक्सेल को ओवरलैप करेगा। प्रत्येक कर्नेल एलिमेंट को उस पिक्सेल वैल्यू से गुणा किया जाना चाहिए जिसके साथ यह ओवरलैप होता है और सभी प्राप्त वैल्यूज का योग किया जाना चाहिए। यह परिणामी योग वर्तमान में कर्नेल के केंद्र के साथ ओवरलैप किए गए वर्तमान पिक्सेल के लिए नया वैल्यू होगा।

यदि कर्नेल सिमेट्रिक नहीं है, तो उपरोक्त के अनुसार कनवल्शन की गणना करने से पूर्व इसे क्षैतिज और ऊर्ध्वाधर अक्ष के चारों ओर फ़्लिप करना होगा।[1]

मैट्रिक्स कनवल्शन का सामान्य रूप है:

एज हैंडलिंग

एज-हैंडलिंग बढ़ाएँ

कर्नेल कनवल्शन के लिए सामान्यतः इमेज सीमाओं के बाहर पिक्सेल से वैल्यू की आवश्यकता होती है। इमेज इमेज को संभालने के लिए कई प्रकार की विधियाँ हैं।

एक्सटेंड
कनवल्शन के लिए वैल्यू प्रदान करने के लिए निकटतम सीमा पिक्सेल को जहाँ तक आवश्यक हो बढ़ाया जाता है। कॉर्नर पिक्सल को 90° वेजेज में बढ़ाया गया है। अन्य एज वाले पिक्सेल लाइनों में विस्तारित हैं।
व्रैप
इमेज वैचारिक रूप से धारण की गई है (या टाइल की गई है) और वैल्यू विपरीत एज या कोने से लिए गए हैं।
मिरर
इमेज वैचारिक रूप से इमेज पर प्रतिबिंबित होती है। उदाहरण के लिए, एज के बाहर पिक्सेल 3 यूनिट्स को लर्निंग का प्रयत्न करने पर इसके अतिरिक्त एज के अंदर 3 यूनिट्स को पढ़ता है।
क्रॉप करें/ओवरलैप से बचें
आउटपुट इमेज में कोई भी पिक्सेल जिसे एज से बियॉन्ड वैल्यूज की आवश्यकता होती है, उसे त्याग दिया जाता है। इस विधि के परिणामस्वरूप आउटपुट इमेज स्मॉल हो सकती है, इमेज को क्रॉप कर दिया गया है। कर्नेल को स्थानांतरित करें जिससे इमेज के बाहर से वैल्यूज की आवश्यकता न हो। मशीन लर्निंग मुख्य रूप से इस एप्रोच का उपयोग करती है। उदाहरण: कर्नेल आकार 10x10, इमेज आकार 32x32, परिणाम इमेज 23x23 है।
कर्नेल क्रॉप
कर्नेल में कोई भी पिक्सेल जो इनपुट इमेज से आगे बढ़ता है, उसका उपयोग नहीं किया जाता है और कम्पनसेट करने के लिए नॉर्मलाइजेशन को समायोजित किया जाता है।
कांस्टेंट
इमेज के बाहर पिक्सेल के लिए कांस्टेंट वैल्यू का उपयोग करें। सामान्यतः काले या कभी-कभी भूरे रंग का प्रयोग किया जाता है। सामान्यतः यह एप्लीकेशन पर निर्भर करता है।

नॉर्मलाइजेशन

नॉर्मलाइजेशन को सभी कर्नेल एलिमेंट्स के योग द्वारा कर्नेल में प्रत्येक एलिमेंट के विभाजन के रूप में परिभाषित किया गया है, जिससे सामान्यीकृत कर्नेल के एलिमेंट्स का योग यूनिटी हो। यह सुनिश्चित करेगा कि मॉडिफाइड इमेज में औसत पिक्सेल मूल इमेज में औसत पिक्सेल जितना ब्राइट हो।

ऑप्टिमिसेशन

तीव्र कनवल्शन एल्गोरिदम में सम्मिलित हैं:[2]

  • सेपरेबल कनवल्शन

सेपरेबल कनवल्शन

M × N कर्नेल के साथ 2D कनवल्शन के लिए प्रत्येक नमूने (पिक्सेल) के लिए M × N मल्टिप्लिकेशन की आवश्यकता होती है। यदि कर्नेल सेपरेबल है, तो गणना को M + N मल्टिप्लिकेशन तक कम किया जा सकता है। भिन्न-भिन्न कनवल्शन का उपयोग करने से 2D कनवल्शन के अतिरिक्त दो बार 1D कनवल्शन करके गणना में अत्यधिक कमी आ सकती है।[3]

इम्प्लीमेंटेशन

यहां जीएलएसएल शेडिंग लैंग्वेज शेडिंग लैंग्वेज के साथ ठोस कनवल्शन इम्प्लीमेंटेशन किया गया है:

// author : csblo
// Work made just by consulting :
// https://en.wikipedia.org/wiki/Kernel_(image_processing)

// Define kernels
#define identity mat3(0, 0, 0, 0, 1, 0, 0, 0, 0)
#define edge0 mat3(1, 0, -1, 0, 0, 0, -1, 0, 1)
#define edge1 mat3(0, 1, 0, 1, -4, 1, 0, 1, 0)
#define edge2 mat3(-1, -1, -1, -1, 8, -1, -1, -1, -1)
#define sharpen mat3(0, -1, 0, -1, 5, -1, 0, -1, 0)
#define box_blur mat3(1, 1, 1, 1, 1, 1, 1, 1, 1) * 0.1111
#define gaussian_blur mat3(1, 2, 1, 2, 4, 2, 1, 2, 1) * 0.0625
#define emboss mat3(-2, -1, 0, -1, 1, 1, 0, 1, 2)

// Find coordinate of matrix element from index
vec2 kpos(int index)
{
    return vec2[9] (
        vec2(-1, -1), vec2(0, -1), vec2(1, -1),
        vec2(-1, 0), vec2(0, 0), vec2(1, 0), 
        vec2(-1, 1), vec2(0, 1), vec2(1, 1)
    )[index] / iResolution.xy;
}


// Extract region of dimension 3x3 from sampler centered in uv
// sampler : texture sampler
// uv : current coordinates on sampler
// return : an array of mat3, each index corresponding with a color channel
mat3[3] region3x3(sampler2D sampler, vec2 uv)
{
    // Create each pixels for region
    vec4[9] region;
    
    for (int i = 0; i < 9; i++)
        region[i] = texture(sampler, uv + kpos(i));

    // Create 3x3 region with 3 color channels (red, green, blue)
    mat3[3] mRegion;
    
    for (int i = 0; i < 3; i++)
        mRegion[i] = mat3(
        	region[0][i], region[1][i], region[2][i],
        	region[3][i], region[4][i], region[5][i],
        	region[6][i], region[7][i], region[8][i]
    	);
    
    return mRegion;
}

// Convolve a texture with kernel
// kernel : kernel used for convolution
// sampler : texture sampler
// uv : current coordinates on sampler
vec3 convolution(mat3 kernel, sampler2D sampler, vec2 uv)
{
    vec3 fragment;
    
    // Extract a 3x3 region centered in uv
    mat3[3] region = region3x3(sampler, uv);
    
    // for each color channel of region
    for (int i = 0; i < 3; i++)
    {
        // get region channel
        mat3 rc = region[i];
        // component wise multiplication of kernel by region channel
        mat3 c = matrixCompMult(kernel, rc);
        // add each component of matrix
        float r = c[0][0] + c[1][0] + c[2][0]
                + c[0][1] + c[1][1] + c[2][1]
                + c[0][2] + c[1][2] + c[2][2];
        
        // for fragment at channel i, set result
        fragment[i] = r;
    }
    
    return fragment;    
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    // Convolve kernel with texture
    vec3 col = convolution(emboss, iChannel0, uv);
    
    // Output to screen
    fragColor = vec4(col, 1.0);
}

संदर्भ

  1. "Example of 2D Convolution".
  2. How Are Convolutions Actually Performed Under the Hood? 2 simple tricks that PyTorch & TensorFlow use to speed up convolutions by Anirudh Shenoy Dec 13, 2019
  3. "कनवल्शन". www.songho.ca. Retrieved 2022-11-19.

यह भी देखें

बाहरी संबंध