การเรียนรู้ OpenCV3 (5.2) - ฟังก์ชั่นการซ่อมแซมภาพสีและการยกเลิกภาพอย่างรวดเร็ว

Opencv3 Learning Image Repair Inpaint Function



เทคนิคการปรับภาพให้เรียบหลายอย่างเช่นการปรับให้เรียบแบบเกาส์การปรับให้เรียบค่ามัธยฐานเป็นต้นเมื่อสัญญาณรบกวนมีขนาดค่อนข้างเล็กผลของเทคนิคเหล่านี้จะดีมาก ในเทคนิคเหล่านี้เราเลือกย่านเล็ก ๆ รอบ ๆ พิกเซลแล้วแทนที่พิกเซลกลางด้วยค่าเฉลี่ยแบบเกาส์เซียนหรือค่าเฉลี่ยมัธยฐาน พูดง่ายๆก็คือการกำจัดสัญญาณรบกวนระดับพิกเซลจะ จำกัด เฉพาะพื้นที่ใกล้เคียงเท่านั้น

ชื่อเต็มของ NL-Means คือ: Non-Local Means แปลตามตัวอักษร ค่าเฉลี่ยที่ไม่ใช่ในท้องถิ่น ในปี 2548 Baudes เสนอว่าอัลกอริทึมใช้ข้อมูลซ้ำซ้อนซึ่งแพร่หลายในภาพธรรมชาติเพื่อลบสัญญาณรบกวน แตกต่างจากการกรองแบบทวิภาคีที่ใช้กันทั่วไปการกรองค่ามัธยฐาน ฯลฯ โดยใช้ข้อมูลในเครื่องของรูปภาพเพื่อกรองโดยจะใช้ภาพทั้งหมดในการแยกส่วนค้นหาพื้นที่ที่คล้ายกันในบล็อกรูปภาพจากนั้นค้นหาพื้นที่เหล่านี้ โดยเฉลี่ยแล้วการลบสัญญาณรบกวนแบบเกาส์เซียนที่มีอยู่ในภาพจะดีกว่าอัลกอริทึมนี้ใช้เวลามากกว่าเทคนิคการปรับให้เรียบที่เราเคยศึกษามาก่อน แต่ผลลัพธ์ที่ได้นั้นดีมาก สำหรับภาพสีขั้นแรกให้แปลงเป็นพื้นที่สี CIELAB จากนั้นแยกส่วนประกอบ L และ AB แยกกันกระบวนการกรองของ NL-Means สามารถแสดงได้ด้วยสูตรต่อไปนี้:





ในสูตรนี้ ใน ( x , )เป็นน้ำหนักที่แสดงออกในภาพต้นฉบับ v ปานกลางพิกเซล x และพิกเซล ความคล้ายคลึงกัน. น้ำหนักนี้มากกว่า 0 และผลรวมของน้ำหนักคือ 1 ซึ่งแสดงโดยสูตร:



Ω x เป็นพิกเซล x ย่าน. สูตรนี้สามารถเข้าใจได้ดังนี้: สำหรับทุกพิกเซลในภาพ x ผลลัพธ์หลังจากการหักลบจะเท่ากับพิกเซลในพื้นที่ใกล้เคียง ผลรวมถ่วงน้ำหนักน้ำหนักถ่วงน้ำหนักเท่ากับ x ด้วย ความคล้ายคลึงกัน. ย่านนี้เรียกอีกอย่างว่าพื้นที่ค้นหา ยิ่งพื้นที่ค้นหามีขนาดใหญ่โอกาสในการค้นหาพิกเซลที่คล้ายกันก็จะมากขึ้น แต่ในขณะเดียวกันปริมาณการคำนวณก็เพิ่มขึ้นอย่างทวีคูณ ในวรรณกรรมที่เสนออัลกอริทึมนี้ บริเวณนี้เป็นภาพทั้งหมด ! ผลลัพธ์คือการประมวลผลอย่างใดอย่างหนึ่งรูปภาพ 512x512 จะใช้เวลาอย่างน้อยสองสามนาที

มีหลายวิธีในการวัดความคล้ายคลึงกันของพิกเซล วิธีที่ใช้บ่อยที่สุดคือการประมาณกำลังสองของความแตกต่างระหว่างค่าความสว่างของสองพิกเซล (ค่าความสว่างต่ำสุดสองพิกเซล!) แต่เนื่องจากมีสัญญาณรบกวนพิกเซลเดียวจึงไม่น่าเชื่อถือ วิธีแก้ปัญหานี้คือพิจารณาย่านใกล้เคียงและเฉพาะในกรณีที่ความคล้ายคลึงกันของย่านนั้นสูงความคล้ายคลึงกันของพิกเซลทั้งสองจะสูง วิธีที่พบบ่อยที่สุดในการวัดความคล้ายคลึงกันระหว่างบล็อกภาพสองบล็อกคือการคำนวณระยะห่างแบบยุคลิดระหว่างพวกเขา:



ในหมู่พวกเขา: n ( x )เป็นปัจจัยที่ทำให้เป็นมาตรฐานซึ่งเป็นผลรวมของน้ำหนักการเป็นเจ้าของและหลังจากแต่ละน้ำหนักถูกหารด้วยปัจจัยแล้วน้ำหนักจะเป็นไปตามเงื่อนไขที่ผลรวมเป็น 1 > 0เป็นค่าสัมประสิทธิ์การกรองที่ควบคุมการลดทอนของฟังก์ชันเลขชี้กำลังเพื่อเปลี่ยนน้ำหนักของระยะทางแบบยุคลิด วี ( x )ด้วย วี ( )แสดงถึงพิกเซล x และพิกเซล พื้นที่ใกล้เคียงซึ่งมักเรียกกันว่าย่านแพทช์ พื้นที่ใกล้เคียงของบล็อกโดยทั่วไปมีขนาดเล็กกว่าพื้นที่ค้นหา ภาพเป็นระยะทางแบบยุคลิดแบบถ่วงน้ำหนักแบบเกาส์ของสองย่าน ในหมู่พวกเขา ถึง > 0เป็นค่าเบี่ยงเบนมาตรฐานของเคอร์เนลเสียน เมื่อมองหาระยะทางแบบยุคลิดน้ำหนักของพิกเซลที่ตำแหน่งต่างกันจะแตกต่างกัน ยิ่งอยู่ใกล้ตรงกลางของบล็อกมากเท่าไหร่น้ำหนักก็ยิ่งมากขึ้นยิ่งอยู่ห่างจากจุดศูนย์กลางมากเท่าไหร่น้ำหนักก็ยิ่งน้อยลงเท่านั้นและน้ำหนักจะเป็นไปตามการกระจายแบบเสียน ในการคำนวณจริงปัญหาของปริมาณการคำนวณจะถูกนำมาพิจารณาและมักใช้น้ำหนักของการกระจายสม่ำเสมอ

ดังแสดงในรูปด้านบน p คือจุดเดโนซิงเนื่องจากย่านของ q1 และ q2 ใกล้เคียงกับ p ดังนั้นน้ำหนัก ใน ( หน้า , อะไร 1)ด้วย ใน ( หน้า , อะไร สอง)ค่าน้ำหนักของจุด q3 ซึ่งค่อนข้างมากและพื้นที่ใกล้เคียงค่อนข้างใหญ่ ใน ( หน้า , อะไร 3)ขนาดเล็กมาก. หากคุณใช้กราฟเพื่อแสดงน้ำหนักของจุดทั้งหมดคุณจะได้รับแผนที่น้ำหนักดังต่อไปนี้:

ในกลุ่มรูปภาพหกกลุ่มทางด้านซ้ายคือรูปภาพต้นฉบับและบล็อกสีขาวตรงกลางแทนพิกเซล x ย่านบล็อกทางขวาคือน้ำหนักที่คำนวณได้กราฟ w (x, y) มีน้ำหนักตั้งแต่ 0 (ดำ) ถึง 1 (สีขาว) พื้นที่ใกล้เคียงของบล็อกจะเคลื่อนผ่านรูปภาพทั้งหมดและคำนวณความคล้ายคลึงกันของพื้นที่อื่น ๆ ในรูปภาพไปยังบล็อก ยิ่งมีความคล้ายคลึงกันมากเท่าใดน้ำหนักที่ได้ก็จะมากขึ้นเท่านั้น สุดท้ายค่าพิกเซลที่คล้ายกันเหล่านี้จะถูกถ่วงน้ำหนักและสรุปตามน้ำหนักหลังการทำให้เป็นมาตรฐานและจะได้ภาพหลังจากการหักลบ

การเลือกพารามิเตอร์ของอัลกอริทึมนี้ก็มีความพิเศษเช่นกัน โดยทั่วไปเมื่อพิจารณาถึงความซับซ้อนของอัลกอริทึมพื้นที่การค้นหาอาจใช้เวลาเป็น 21x21 และบล็อกของการเปรียบเทียบความคล้ายคลึงกันอาจใช้เวลา 7x7 ในทางปฏิบัติมักจะต้องเลือกพารามิเตอร์ที่เหมาะสมตามเสียงรบกวน ค่าเบี่ยงเบนมาตรฐานของเสียงเกาส์เซียน σ มีขนาดใหญ่ขึ้นเพื่อให้อัลกอริทึมมีประสิทธิภาพมากขึ้นจำเป็นต้องเพิ่มพื้นที่บล็อกและการเพิ่มพื้นที่บล็อกจำเป็นต้องเพิ่มพื้นที่การค้นหาด้วย ในเวลาเดียวกันค่าสัมประสิทธิ์การกรอง เทียบกับ σ ความสัมพันธ์เชิงบวก: = ถึง σ เมื่อบล็อกใหญ่ขึ้น ถึง จำเป็นต้องลดลงอย่างเหมาะสม

ความซับซ้อนของอัลกอริทึม NL-Means เกี่ยวข้องอย่างใกล้ชิดกับขนาดของรูปภาพจำนวนช่องสีขนาดของบล็อกที่ใกล้เคียงกันและขนาดของช่องค้นหา ขนาดของภาพคือ N × N และจำนวนช่องสีคือ ขนาดของบล็อกคือ k × k ขนาดของช่องค้นหาคือ n × n จากนั้นความซับซ้อนของอัลกอริทึมคือ: (ดูแย่มาก). สำหรับภาพสี 512 × 512 จะมีการตั้งค่า k = 7 และ n = 21 ในกรณีที่ใช้มัลติเธรด OpenCV จะใช้เวลาหลายสิบวินาทีในการประมวลผลภาพ แม้ว่าบางคนจะปรับปรุงและเพิ่มความเร็วตามอัลกอริทึมนี้อย่างต่อเนื่อง แต่ก็ยังห่างไกลจากการประมวลผลแบบเรียลไทม์

จาก: http://www.cnblogs.com/jsxyhelu/p/7080975.html

OpenCV มีสี่รูปแบบของเทคโนโลยีนี้

CV_EXPORTS_W void fastNlMeansDenoising( InputArray src, OutputArray dst, float h = 3, int templateWindowSize = 7, int searchWindowSize = 21) Src // must be U8 h // Weight decay parameter templateWindowSize = 7, // Size of patches used for comparison searchWindowSize = 21 // Maximum patch distance to consider CV_EXPORTS_W void fastNlMeansDenoisingColored( InputArray src, OutputArray dst, float h = 3, float hColor = 3, int templateWindowSize = 7, int searchWindowSize = 21) Src // Input image must be U8C3 h = 3, // Luminosity weight decay parameter hColor = 3, // Color weight decay parameter CV_EXPORTS_W void fastNlMeansDenoisingMulti( InputArrayOfArrays srcImgs, OutputArray dst, int imgToDenoiseIndex, int temporalWindowSize, float h = 3, int templateWindowSize = 7, int searchWindowSize = 21) srcImgs// Sequence of several images imgToDenoiseIndex, // Index of image to denoise temporalWindowSize, // Num images to use (odd) h = 3, // Weight decay parameter templateWindowSize = 7, // Size of comparison patches searchWindowSize = 21 // Maximum patch distance CV_EXPORTS_W void fastNlMeansDenoisingColoredMulti( InputArrayOfArrays srcImgs, OutputArray dst, int imgToDenoiseIndex, int temporalWindowSize, float h = 3, float hColor = 3, int templateWindowSize = 7, int searchWindowSize = 21) hColor = 3, // Weight decay param for color


1. cv2.fastNlMeansDenoising () ใช้วัตถุเป็นภาพระดับสีเทา
2. cv2.fastNlMeansDenoisingColored () ใช้วัตถุเป็นแผนที่สี ภาพอินพุตมีสัญญาณรบกวนที่มีความแปรปรวน 25 ด้านล่าง
ผล.

3. cv2.fastNlMeansDenoisingMulti () เหมาะสำหรับลำดับภาพระยะสั้น (ภาพสีเทา)
หากต้องการใช้วิธีนี้สำหรับวิดีโอ พารามิเตอร์แรกคือรายการของเฟรมเสียง พารามิเตอร์ตัวที่สอง imgtoDenoiseIndex กำหนดว่าเฟรมใดต้องถูก denoised และเราสามารถส่งผ่านดัชนีของเฟรมได้ พารามิเตอร์ที่สาม temporaWindowSize กำหนดจำนวนของเฟรมที่อยู่ติดกันที่ใช้สำหรับการดีโนซิงซึ่งควรเป็นจำนวนคี่ ในกรณีนี้ภาพของเฟรม temporaWindowSize จะถูกใช้สำหรับการ denoising และเฟรมตรงกลางคือเฟรมที่จะถูก denoised ตัวอย่างเช่นเราส่งผ่านรูปภาพ 5 เฟรม ได้แก่ imgToDoneiseIndex = 2 และ temporalW indowSize = 3 จากนั้นเฟรมแรกเฟรมที่สองและรูปภาพเฟรมที่สามจะถูกใช้เพื่อแสดงภาพเฟรมที่สอง


การคำนวณใช้เวลามากพอสมควร ภาพแรกคือภาพต้นฉบับภาพที่สองคือภาพที่มีสัญญาณรบกวนและภาพที่สามคือภาพหลังจากลบสัญญาณรบกวนแล้ว
4. cv2.fastNlMeansDenoisingColoredMulti () สำหรับลำดับภาพระยะสั้น (ภาพสี)
พารามิเตอร์ทั่วไปคือ:
• h: กำหนดความแรงของตัวกรอง ค่า h ที่สูงสามารถลบจุดรบกวนได้ดี แต่ยังลบรายละเอียดของภาพด้วย (เอา 10 กำลังดี)
• hForColorComponents: เหมือนกับ h แต่มีภาพสี (เช่นเดียวกับ h)
• templateWindowSize: แปลก (ค่าที่แนะนำคือ 7)
• searchWindowSize: แปลก (ค่าที่แนะนำคือ 21)

จาก: https://blog.csdn.net/chuhang_zhqr/article/details/51069156