आम तौर पर एज डिटेक्शन उच्च ढाल मूल्य वाले छवि के क्षेत्रों का पता लगाने के लिए उबलता है।
हमारे मामले में हम ढाल को छवि फ़ंक्शन के व्युत्पन्न के रूप में ढाल सकते हैं, इसलिए ढाल का परिमाण आपको इस बात की जानकारी देता है कि आपकी छवि स्थानीय रूप से (पड़ोसी पिक्सल / टेक्सल्स के संबंध में) कितनी बदलती है।
अब, एक किनारे जैसा कि आप असंतोष का संकेत कहते हैं, इसलिए अब हमने ग्रेडिएंट को परिभाषित किया है यह स्पष्ट है कि यह जानकारी हम सभी की आवश्यकता है। एक बार जब हम एक छवि का ढाल पाते हैं, तो यह द्विआधारी मूल्य बढ़त / गैर-बढ़त प्राप्त करने के लिए केवल एक सीमा लागू करने की बात है।
आप कैसे इस ढाल को वास्तव में आप क्या पूछ रहे हैं और मुझे जवाब देना बाकी है :)
बहुत सारे तरीके! यहाँ एक जोड़ी :)
शेड कार्यों में निर्मित
दोनों hlsl और glsl व्युत्पन्न कार्य प्रदान करते हैं। GLSL में आपके पास dFdx और dFdy हैं जो आपको क्रमशः x और y दिशा में क्रमिक जानकारी देते हैं। आमतौर पर इन कार्यों का मूल्यांकन 2x2 टुकड़ों के एक ब्लॉक में किया जाता है।
जब तक आप एक ही दिशा में रुचि रखते हैं, एक अच्छा तरीका है एक कॉम्पैक्ट नतीजा यह है कि इंगित करता है कैसे मजबूत क्षेत्र में ढाल कर रहा है के लिए fwidth है कि आप और कुछ नहीं लेकिन dFdy और dFdy का निरपेक्ष मान का योग देता है।
आपको किसी विशिष्ट चैनल के बजाय समग्र छवि पर एक किनारे में रुचि होने की संभावना है, इसलिए आप अपनी छवि फ़ंक्शन को लूमा में बदलना चाह सकते हैं। इसे ध्यान में रखते हुए, जब यह पता चलता है कि आपके शेड में कुछ इस तरह शामिल हो सकता है:
float luminance = dot(yourFinalColour,vec3(0.2126, 0.7152, 0.0722));
float gradient = fwidth(luminance );
float isEdge = gradient > threshold;
एक उच्च सीमा के साथ आप मोटे किनारों को पाएंगे और आप कुछ को याद कर सकते हैं, इसके विपरीत, कम सीमा के साथ आप गलत किनारों का पता लगा सकते हैं। आपको उस सीमा को खोजने के लिए प्रयोग करना होगा जो आपकी आवश्यकताओं के अनुसार बेहतर हो।
इन कार्यों के कारण का उल्लेख करने लायक है, लेकिन मेरे पास इसके लिए अभी समय नहीं है, मुझे इस उत्तर को बाद में अपडेट करने की संभावना है :)
स्क्रीन स्पेस पोस्ट-प्रोसेस
आप इस से अधिक कट्टर जा सकते हैं, अब इमेज प्रोसेसिंग में एज डिटेक्शन का क्षेत्र बहुत अधिक है। मैं आपकी आवश्यकताओं के अनुसार एज डिटेक्शन का पता लगाने के लिए आपको दसियों अच्छे तरीकों का हवाला दे सकता हूं, लेकिन चलो इसे अभी के लिए सरल रखें, यदि आप रुचि रखते हैं तो मैं आपको और विकल्प चुन सकता हूं।
तो यह विचार ऊपर वाले के समान होगा, इस अंतर के साथ कि आप एक व्यापक पड़ोस को देख सकते हैं और यदि आप चाहते हैं तो नमूने पर घेरने वाले वजन का एक सेट का उपयोग कर सकते हैं। आमतौर पर, आप अपनी छवि पर एक कर्नेल के साथ एक कनवल्शन चलाते हैं जो आपको एक अच्छी ग्रेडिएंट जानकारी देता है।
एक बहुत ही सामान्य विकल्प है सोबेल कर्नेल
जो क्रमशः आपको x और y दिशाओं में ग्रेडिएंट देते हैं:
जी आर एक घi e n t Ma gn i t u de = ( G r a dमैं ई एन टीएक्स)2+ ( G r a dमैं ई एन टीy)2-----------------------√
फिर आप उसी तरह से बता सकते हैं जिस तरह से मैंने ऊपर बताया है।
यह कर्नेल जैसा कि आप केंद्रीय पिक्सेल को अधिक वजन दे सकते हैं, इसलिए प्रभावी रूप से ग्रेडिएंट + को थोड़ा चौरसाई कर रहा है जो पारंपरिक रूप से मदद करता है (अक्सर छवि छोटे किनारों को खत्म करने के लिए धुंधली होती है)।
उपरोक्त काफी अच्छी तरह से काम करता है, लेकिन अगर आपको चौरसाई पसंद नहीं है तो आप प्रीविट कर्नेल का उपयोग कर सकते हैं:
(नोट मैं जल्दबाज़ी में हूँ, जल्द ही चित्रों के बजाय उचित स्वरूपित पाठ लिखूंगा!)
वास्तव में वास्तविक समय ग्राफिक्स के बजाय छवि प्रक्रिया-वाई तरीके से बढ़त का पता लगाने के लिए बहुत अधिक गुठली और तकनीकें हैं, इसलिए मैंने अधिक जटिल (दंडित इरादा नहीं) विधियों को बाहर रखा है क्योंकि शायद आप dFdx / y फ़ंक्शन के साथ ठीक हो जाएंगे ।