การตรวจจับขอบโดยทั่วไปจะลดลงเพื่อตรวจจับพื้นที่ของภาพด้วยค่าการไล่ระดับสีสูง
ในกรณีของเราเราสามารถมองเห็นการไล่ระดับสีอย่างคร่าวๆในฐานะที่เป็นอนุพันธ์ของฟังก์ชั่นภาพดังนั้นขนาดของการไล่ระดับสีจะให้ข้อมูลว่าภาพของคุณมีการเปลี่ยนแปลงในระดับท้องถิ่นเท่าใด
ตอนนี้ขอบเป็นอย่างที่คุณบอกว่าบ่งบอกถึงความไม่ต่อเนื่องดังนั้นตอนนี้เราจึงกำหนดให้การไล่ระดับสีเป็นที่ชัดเจนว่าข้อมูลนี้เป็นสิ่งที่เราต้องการ เมื่อเราพบการไล่ระดับสีของรูปภาพมันเป็นเพียงเรื่องของการใช้เก ณ ฑ์เพื่อให้ได้ค่าขอบไบนารี / ไม่ใช่ขอบ
คุณจะพบว่าการไล่ระดับสีนี้เป็นสิ่งที่คุณถามจริง ๆ และฉันยังตอบ :)
มีหลายวิธี! ที่นี่สองสาม :)
ฟังก์ชัน shader ในตัว
ทั้ง hlsl และ glsl เสนอฟังก์ชันอนุพันธ์ ใน GLSL คุณมีdFdx และ dFdyที่ให้ข้อมูลการไล่ระดับสีตามลำดับในทิศทาง x และ y โดยทั่วไปฟังก์ชั่นเหล่านี้จะถูกประเมินในบล็อกของ 2x2 แฟรกเมนต์
หากคุณไม่สนใจทิศทางเดียววิธีที่ดีที่จะได้ผลลัพธ์ที่มีขนาดกะทัดรัดซึ่งบ่งบอกว่าการไล่ระดับสีในภูมิภาคนั้นแข็งแกร่งเพียงใดคือความกว้างที่ให้คุณไม่มีอะไรนอกจากผลรวมของค่าสัมบูรณ์ของ dFdy และ dFdy
คุณน่าจะสนใจขอบภาพโดยรวมมากกว่าในช่องเฉพาะดังนั้นคุณอาจต้องการเปลี่ยนฟังก์ชั่นภาพเป็น luma เมื่อคำนึงถึงการตรวจจับที่ขอบเครื่อง Shader ของคุณอาจรวมถึงบางสิ่งที่คล้ายกับ:
float luminance = dot(yourFinalColour,vec3(0.2126, 0.7152, 0.0722));
float gradient = fwidth(luminance );
float isEdge = gradient > threshold;
ด้วยเกณฑ์ที่สูงคุณจะได้พบกับ coarser edge และคุณอาจจะพลาดบางส่วนในทางกลับกันด้วย threshold ที่ต่ำคุณอาจตรวจจับ edge false คุณต้องทดลองเพื่อหาเกณฑ์ที่เหมาะสมกับความต้องการของคุณมากขึ้น
เหตุผลที่ฟังก์ชั่นเหล่านี้ใช้งานได้คุ้มค่าที่จะกล่าวถึง แต่ตอนนี้ฉันไม่มีเวลาเลยฉันน่าจะอัพเดตคำตอบนี้ในภายหลัง :)
กระบวนการหน้าจอพื้นที่โพสต์
คุณสามารถไปได้ไกลกว่านี้ตอนนี้สนามของการตรวจจับขอบในการประมวลผลภาพนั้นใหญ่โต ฉันสามารถบอกคุณได้หลายวิธีที่ดีในการตรวจจับการตรวจจับขอบตามความต้องการของคุณ แต่ตอนนี้ให้มันง่ายถ้าคุณสนใจฉันสามารถอ้างอิงตัวเลือกเพิ่มเติม!
ดังนั้นความคิดจะคล้ายกับที่กล่าวมาข้างต้นด้วยความแตกต่างที่คุณสามารถมองไปที่บริเวณใกล้เคียงที่กว้างขึ้นและใช้ชุดน้ำหนักของตัวอย่างที่ทำให้ขุ่นเคืองหากคุณต้องการ โดยทั่วไปแล้วคุณจะใช้รูปแบบการแปลงภาพของคุณด้วยเคอร์เนลที่ให้ข้อมูลการไล่ระดับสีที่ดี
ตัวเลือกทั่วไปคือเคอร์เนล Sobel
ซึ่งตามลำดับให้การไล่ระดับสีในทิศทาง x และ y:
คุณสามารถรับค่าเดียวจากการไล่ระดับสีเป็นg r a dฉันe n ทีเอ็มกรัมn ฉันt U วันที่e = ( G r a dผม e n Tx)2+ ( G r a dฉันจn TY)2-----------------------√
จากนั้นคุณสามารถกำหนดเกณฑ์เช่นเดียวกับที่ฉันกล่าวไว้ข้างต้น
เคอร์เนลนี้ตามที่คุณเห็นจะให้น้ำหนักมากขึ้นกับพิกเซลกลางดังนั้นการคำนวณลาดแบบค่อยเป็นค่อยไป + การปรับให้เรียบซึ่งช่วยตามประเพณี (บ่อยครั้งที่ภาพจะเป็นแบบเกาส์เบลอเพื่อกำจัดขอบขนาดเล็ก)
การทำงานด้านบนค่อนข้างดี แต่ถ้าคุณไม่ชอบความราบเรียบคุณสามารถใช้ Prewitt Kernels ได้:
(หมายเหตุฉันรีบเร่งจะเขียนข้อความที่จัดรูปแบบที่เหมาะสมแทนภาพเร็ว ๆ นี้!)
จริง ๆ แล้วมีเมล็ดและเทคนิคต่าง ๆ มากมายในการค้นหาการตรวจจับขอบในกระบวนการภาพมากกว่ากราฟิกแบบเรียลไทม์ดังนั้นฉันจึงได้แยกวิธีที่ซับซ้อนมากขึ้น .