5.14. การทำให้เรียบแบบเกาส์เซียนและขอบ¶
งานสองประเภทครอบงำการใช้หน้าต่างบริเวณใกล้เคียงในการมองเห็นของเครื่องแบบคลาสสิก ได้แก่ การทำให้การเปลี่ยนแปลงระหว่างพิกเซลต่อพิกเซลเรียบขึ้นอย่างสะอาด และการหาขอบที่ภาพเปลี่ยนแปลงอย่างเฉียบพลัน ฟิลเตอร์เกาส์เซียนเป็นเครื่องมือมาตรฐานสำหรับงานแรก และตัวตรวจจับบนพื้นฐาน Laplacian เป็นเครื่องมือมาตรฐานสำหรับงานที่สอง ทั้งสองใช้ร่วมกันได้เพราะตัวตรวจจับขอบทุกตัวทำงานได้ดีขึ้นบนอินพุตที่ทำให้เรียบเบาๆ
5.14.1. ฟิลเตอร์เกาส์เซียน¶
gaussian() คือญาติที่ถ่วงน้ำหนักที่ศูนย์กลางของ mean() ทั้งสองคำนวณค่าเฉลี่ยบนบริเวณใกล้เคียงของแต่ละพิกเซล แต่น้ำหนักของเกาส์เซียนไม่สม่ำเสมอ: พิกเซลที่อยู่ใกล้ศูนย์กลางของบริเวณใกล้เคียงจะมีน้ำหนัก มากกว่า พิกเซลที่ขอบของบริเวณใกล้เคียงจะมีน้ำหนัก น้อยกว่า โดยน้ำหนักเป็นไปตามเส้นโค้งรูปกระดิ่งที่คุ้นเคยซึ่งให้ชื่อกับฟิลเตอร์นี้
การถ่วงน้ำหนักรูปกระดิ่งคือสิ่งที่ทำให้ฟิลเตอร์เกาส์เซียนเรียบกว่าค่าเฉลี่ยแบบกล่อง การกรองแบบ Mean อาจสร้างสิ่งที่มองเห็นไม่ดีที่ขอบของวัตถุ เนื่องจากค่าตัดออกที่แข็งในการถ่วงน้ำหนักจะสร้างรูปแบบริ้วคลื่นเล็กๆ ที่การเปลี่ยนแปลงอย่างเฉียบพลัน น้ำหนักที่ลดลงอย่างราบเรียบของเกาส์เซียนจะหลีกเลี่ยงการริ้วคลื่นนั้นและให้ผลลัพธ์ที่ดูใกล้เคียงกับสิ่งที่ "เบลอ" ควรมีลักษณะอย่างไร ต้นทุนคือการคำนวณต่อพิกเซลมากกว่าฟิลเตอร์ mean แต่ไม่มากนัก ต้นทุนต่อพิกเซลยังต่ำกว่าฟิลเตอร์ bilateral มาก
img.gaussian(1) # 3x3 Gaussian -- a clean light blur
img.gaussian(2) # 5x5 Gaussian -- stronger smoothing
การทำให้เรียบแบบเกาส์เซียนเป็น ขั้นตอนแรก มาตรฐานของไปป์ไลน์การตรวจจับขอบเกือบทุกตัว ตัวตรวจจับขอบด้านล่างทั้งหมดจะขยายเนื้อหาความถี่สูง รวมถึงสัญญาณรบกวนจากเซนเซอร์ที่อัลกอริทึมไม่ต้องการตรวจจับจริงๆ การรันเกาส์เซียนเบาๆ ก่อนจะระงับสัญญาณรบกวนนั้นโดยไม่ทำให้ขอบจริงนิ่มมากนัก ทำให้ตัวตรวจจับขอบค้นหาขอบ จริง แทนที่จะเป็นจุดรบกวน
5.14.2. Unsharp masking¶
สำเนาภาพที่เบลอแบบเกาส์เซียนเป็นวัตถุดิบที่เทคนิค unsharp mask ใช้สำหรับการทำให้คมชัดแบบคลาสสิก การตั้งค่า unsharp=True บนฟิลเตอร์จะสลับจาก "สร้างภาพที่เบลอ" ไปเป็น "ลบภาพที่เบลอออกจากต้นฉบับและเพิ่มความแตกต่างกลับเข้าสู่ต้นฉบับ" ผลกระทบคือขอบที่มีความถี่สูงจะถูกขยายเมื่อเทียบกับภายในที่เรียบ
img.gaussian(1, unsharp=True)
พารามิเตอร์ mul และ add ที่เป็นตัวเลือกจะปรับความแรงของผลลัพธ์ unsharp โดยค่าเริ่มต้น (mul=1.0, add=0.0) คือการทำให้คมชัดแบบปานกลางที่ไม่ขยายสัญญาณรบกวนจากเซนเซอร์
5.14.3. ฟิลเตอร์ Laplacian¶
laplacian() รันการประมาณค่าแบบไม่ต่อเนื่องของ อนุพันธ์เชิงพื้นที่ลำดับสอง ของภาพ เอาต์พุตจะมีขนาดใหญ่ในที่ที่ค่าพิกเซลเปลี่ยนแปลง อย่างรวดเร็ว และใกล้ศูนย์ในที่ที่ค่าคงที่หรือเปลี่ยนแปลงเชิงเส้น การอ่านผลลัพธ์ตามธรรมชาติคือการตอบสนองต่อขอบ: พิกเซลที่ภาพเปลี่ยนแปลงอย่างรวดเร็วจะสว่างขึ้น ส่วนพิกเซลในภายในที่เรียบจะยังคงมืด
img.laplacian(1) # 3x3 Laplacian -- edge response
พารามิเตอร์เดียวกับ gaussian สามารถใช้ได้ sharpen=True จะสร้างภาพที่คมชัดขึ้น (Laplacian เพิ่ม กลับเข้าสู่ต้นฉบับแทนที่จะส่งคืนเอง) mul และ add จะปรับขนาดการตอบสนอง
การใช้งานในทางปฏิบัติที่นอกเหนือจากการตรวจจับขอบคือ การวัดโฟกัส การตอบสนองของ Laplacian ที่เฉลี่ยในบริเวณหนึ่งจะให้การวัดคร่าวๆ ว่าบริเวณนั้นมีเนื้อหาความถี่สูงมากแค่ไหน บนเฟรมที่โฟกัสดีค่าเฉลี่ยนั้นจะสูง บนเฟรมที่เบลอจะลดลง การเปรียบเทียบการตอบสนองของ Laplacian ในแต่ละเฟรมเป็นวิธีราคาถูกในการถามว่า "เลนส์โฟกัสหรือไม่" โดยไม่ต้องใช้เมตริกคอนทราสต์ที่แพงกว่า
5.14.4. เมธอด find_edges¶
find_edges() รันไปป์ไลน์การตรวจจับขอบที่สมบูรณ์แทนที่จะเป็นแค่ฟิลเตอร์การตอบสนองต่อขอบ โดยทำงานบนภาพระดับสีเทา และผลลัพธ์เป็นภาพไบนารีที่พิกเซลที่ไม่ใช่ศูนย์จะทำเครื่องหมายตำแหน่งที่อินพุตมีการเปลี่ยนแปลงความสว่างในแบบที่ควรนับเป็นขอบ
เมธอดรับพารามิเตอร์ edge_type ที่เลือกระหว่างสองอัลกอริทึม:
EDGE_SIMPLE รันฟิลเตอร์ high-pass ใช้ค่าขีดแบ่ง และส่งคืนผลลัพธ์ เร็ว แต่เอาต์พุตรวมการเปลี่ยนแปลงความสว่างทุกอย่างที่อยู่เหนือค่าขีดแบ่ง รวมถึงสัญญาณรบกวนและพื้นผิวที่แอปพลิเคชันอาจไม่สนใจ เหมาะสมสำหรับภาพที่สะอาดและสำหรับกรณีที่สัญญาณรบกวนจะถูกทำความสะอาดโดยการส่งผ่านทางสัณฐานวิทยาในภายหลัง
EDGE_CANNY รันตัวตรวจจับขอบ Canny ซึ่งเป็นอัลกอริทึมหลายขั้นตอนแบบคลาสสิก โดยคำนวณการไล่ระดับความสว่าง ระงับการตอบสนองที่ไม่ใช่ค่าสูงสุดทุกตัวตามทิศทางการไล่ระดับ (ดังนั้นขอบแต่ละขอบจึงมีความกว้างหนึ่งพิกเซล) และใช้ค่าขีดแบ่งแบบ hysteresis (ดังนั้นขอบที่แข็งแกร่งในจุดหนึ่งจะถูกติดตามแม้ว่าจะจางลงระหว่างนั้น) ผลลัพธ์คือชุดพิกเซลขอบที่สะอาด บาง และเชื่อมต่อกันในแบบที่อัลกอริทึมที่ใช้ขอบแบบคลาสสิกทุกตัวต้องการ
พารามิเตอร์ threshold คือทูเพิลสองสมาชิก (low, high) สำหรับ EDGE_CANNY ค่า high คือค่าตัดออกที่พิกเซลเป็นขอบอย่างแน่นอน และค่า low คือค่าตัดออกที่พิกเซลเป็นขอบเฉพาะเมื่อเชื่อมต่อกับขอบที่แน่นอน สำหรับ EDGE_SIMPLE จะใช้เฉพาะค่า high เท่านั้น ซึ่งเป็นค่าตัดออกเดียวที่พิกเซลนับเป็นขอบ ค่าเริ่มต้นของ (100, 200) เป็นจุดเริ่มต้นที่ควรปรับแต่งสำหรับฉากเฉพาะ
img.gaussian(1) # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))
ตัวตรวจจับ Canny เป็นตัวเลือกที่ดีกว่าสำหรับเกือบทุกแอปพลิเคชันที่ขอบมีความสำคัญ EDGE_SIMPLE ที่เร็วกว่าควรจำไว้สำหรับกรณีที่ต้นทุนของ Canny เป็นปัญหาและการปฏิเสธสัญญาณรบกวนของ hysteresis ไม่จำเป็นจริงๆ
5.14.5. การใช้ค่าขีดแบ่งแบบปรับตัวบนเกาส์เซียน¶
เหมือนกับ ฟิลเตอร์สถิติ gaussian() รองรับคู่คีย์เวิร์ด threshold=True / offset=N สำหรับการใช้ค่าขีดแบ่งแบบปรับตัว พฤติกรรมนั้นเหมือนกับ mean(): สถิติเกาส์เซียนในแต่ละตำแหน่งจะกลายเป็นค่าตัดออกเฉพาะที่ และพิกเซลต้นทางจะถูกเปรียบเทียบกับสถิติบวกออฟเซ็ตเพื่อสร้างผลลัพธ์แบบไบนารี
ตัวแปรเกาส์เซียนมักเป็นตัวเลือกที่สะอาดที่สุดสำหรับการใช้ค่าขีดแบ่งแบบปรับตัวเมื่ออินพุตไม่มีสัญญาณรบกวนมากนัก ค่าเฉลี่ยถ่วงน้ำหนักจะให้ค่าตัดออกที่เรียบกว่าที่ฟิลเตอร์ mean สร้าง โดยมีสิ่งที่มองเห็นไม่ดีน้อยลงที่การเปลี่ยนแปลงแสงสว่างอย่างเฉียบพลัน