Gaussian Blur นำมาใช้อย่างไร


42

ฉันอ่านว่าพร่ามัวทำในกราฟิกแบบเรียลไทม์โดยทำบนแกนเดียวแล้วก็อีกอัน

ฉันเคยทำข้อตกลงเล็กน้อยใน 1D มาก่อน แต่ฉันไม่สบายใจกับมันมากนักและไม่รู้ว่าจะทำอย่างไรในกรณีนี้

ทุกคนสามารถอธิบายด้วยวิธีธรรมดาว่าภาพ Gaussian Blur ของภาพเสร็จสิ้นได้อย่างไร

ฉันเคยได้ยินเช่นกันว่ารัศมีของเบลอสามารถส่งผลกระทบต่อประสิทธิภาพการทำงาน นั่นเป็นเพราะต้องทำข้อตกลงที่ใหญ่กว่าหรือไม่?

คำตอบ:


48

ในการสนทนาสองฟังก์ชั่นทางคณิตศาสตร์จะรวมกันเพื่อสร้างฟังก์ชั่นที่สาม ในฟังก์ชั่นการประมวลผลภาพมักจะเรียกว่าเมล็ด เคอร์เนลคืออะไรมากกว่าอาร์เรย์พิกเซล (สี่เหลี่ยมจัตุรัส) (ภาพเล็ก ๆ ดังนั้นควรพูด) โดยปกติแล้วค่าในเคอร์เนลจะเพิ่มขึ้นเป็นหนึ่งค่า เพื่อให้แน่ใจว่าจะไม่เพิ่มหรือลบพลังงานออกจากภาพหลังการใช้งาน

โดยเฉพาะเคอร์เนล Gaussian (ใช้สำหรับ Gaussian เบลอ) เป็นอาร์เรย์สี่เหลี่ยมจัตุรัสของพิกเซลที่ค่าพิกเซลสอดคล้องกับค่าของเส้นโค้ง Gaussian (ใน 2D)

ภาพที่เชื่อมโยงจาก http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm

แต่ละพิกเซลในภาพจะถูกคูณด้วยเคอร์เนลเกาส์เซียน สิ่งนี้ทำได้โดยการวางจุดศูนย์กลางของเคอร์เนลลงบนพิกเซลของภาพและคูณค่าในภาพต้นฉบับด้วยพิกเซลในเคอร์เนลที่ทับซ้อนกัน ค่าที่เกิดจากการคูณเหล่านี้จะถูกเพิ่มและผลลัพธ์นั้นจะถูกใช้สำหรับค่าที่พิกเซลปลายทาง เมื่อดูที่รูปภาพคุณจะคูณค่าที่ (0,0) ในอินพุตอาร์เรย์ด้วยค่าที่ (i) ในเคอร์เนลอาร์เรย์ค่าที่ (1,0) ในอาร์เรย์อินพุตด้วยค่าที่ (h ) ในเคอร์เนลอาเรย์และอื่น ๆ จากนั้นเพิ่มค่าเหล่านี้ทั้งหมดเพื่อรับค่า (1,1) ที่อิมเมจเอาต์พุต

รูปภาพที่เชื่อมโยงจาก http://www.songho.ca/dsp/convolution/convolution.html

เพื่อตอบคำถามที่สองของคุณก่อนยิ่งเคอร์เนลยิ่งใหญ่การดำเนินการก็จะยิ่งแพง ดังนั้นยิ่งรัศมีของเบลอมากเท่าไหร่การใช้งานก็จะยิ่งนานขึ้นเท่านั้น

เพื่อตอบคำถามแรกของคุณตามที่อธิบายไว้ข้างต้นสามารถทำได้โดยการคูณพิกเซลอินพุตเข้ากับเคอร์เนลทั้งหมด อย่างไรก็ตามหากเคอร์เนลมีความสมมาตร (ซึ่งเป็นเคอร์เนลเกาส์เซียน) คุณสามารถคูณแต่ละแกน (x และ y) ได้อย่างอิสระซึ่งจะลดจำนวนการคูณทั้งหมด ในแง่คณิตศาสตร์ที่เหมาะสมถ้าเมทริกซ์สามารถแบ่งได้เมทริกซ์สามารถแบ่งเป็น (M × 1) และเมทริกซ์ (1 × N) สำหรับเคอร์เนล Gaussian ด้านบนหมายความว่าคุณสามารถใช้เคอร์เนลต่อไปนี้ได้:

1256[1464141624164624362464162416414641]=1256[14641][14641]

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีดูว่าเคอร์เนลแยกได้หรือไม่ให้ไปที่ลิงก์นี้

แก้ไข: เมล็ดทั้งสองที่แสดงด้านบนใช้ค่าที่แตกต่างกันเล็กน้อย นี่เป็นเพราะพารามิเตอร์ (sigma) ที่ใช้สำหรับส่วนโค้ง Gaussian เพื่อสร้างเมล็ดเหล่านี้มีความแตกต่างกันเล็กน้อยในทั้งสองกรณี สำหรับคำอธิบายว่าพารามิเตอร์ใดมีอิทธิพลต่อรูปร่างของเส้นโค้งเกาส์เซียนและทำให้ค่าในเคอร์เนลตามลิงค์นี้

แก้ไข: ในภาพที่สองด้านบนจะบอกว่าเคอร์เนลที่ใช้ถูกพลิก หลักสูตรนี้สร้างความแตกต่างได้ถ้าเคอร์เนลที่คุณใช้นั้นไม่สมมาตร เหตุผลที่คุณต้องพลิกเคอร์เนลนั้นเกี่ยวข้องกับคุณสมบัติทางคณิตศาสตร์ของการดำเนินการสังสรร (ดูลิงค์สำหรับคำอธิบายเชิงลึกเพิ่มเติมเกี่ยวกับการบิด) ใส่เพียง: ถ้าคุณจะไม่พลิกเคอร์เนลผลลัพธ์ของการดำเนินการ convolution จะถูกพลิก โดยการพลิกเคอร์เนลคุณจะได้รับผลลัพธ์ที่ถูกต้อง


1
คุณสามารถเพิ่มบันทึกย่อเพื่ออธิบายว่าทำไมทั้งสองแตกต่างกัน 5 โดย 5 เมล็ดมีตัวเลขแตกต่างกันเล็กน้อย (หนึ่งรวม 273 อื่น ๆ รวมถึง 256) ดูเหมือนจะเป็นความสับสนที่อาจเกิดขึ้นกับบางคนที่เพิ่งเริ่มทำสิ่งนี้
trichoplax

คุณสามารถอธิบายได้ว่าทำไมเคอร์เนลพลิกในไดอะแกรมที่สองของคุณหรือไม่ ฉันไม่คิดว่ามันเกี่ยวข้องกับคำอธิบาย แต่ความจริงที่ว่ามันเป็นขั้นตอนพิเศษที่ชัดเจนอาจขัดขวางความเข้าใจกับคนที่ไม่ทราบว่าไม่จำเป็น
trichoplax

อย่าลืมที่จะทำงานในพื้นที่สีเชิงเส้นเพื่อผลลัพธ์ที่ถูกต้อง
v.oddou

16

นี่คือบทความที่ดีที่สุดที่ผมเคยอ่านในหัวข้อ: เกาส์เบลอที่มีประสิทธิภาพด้วยการสุ่มตัวอย่างเชิงเส้น มันตอบคำถามของคุณทั้งหมดและสามารถเข้าถึงได้จริงๆ

สำหรับคำอธิบายสั้น ๆ ของคนธรรมดา: เกาส์เซียนเป็นฟังก์ชั่นที่มีคุณสมบัติที่ดีของการแบ่งแยกได้ซึ่งหมายความว่าฟังก์ชั่นแบบเกาส์ 2D สามารถคำนวณได้โดยการรวม 1D เกาส์สองฟังก์ชัน

n×nO(n2)2×nO(n)

nn


13

โดยทั่วไปแล้วการบิดจะดำเนินการโดยการนำเอาส่วนประกอบของสองฟังก์ชันในหน้าต่างบานเลื่อน แต่ถ้าคุณไม่ได้มาจากพื้นหลังทางคณิตศาสตร์นั่นไม่ใช่คำอธิบายที่มีประโยชน์มากและแน่นอนจะไม่ทำให้คุณมีสัญชาตญาณที่มีประโยชน์ สำหรับมัน. ยิ่งไปกว่านั้นสังวัตนาช่วยให้หลายจุดในสัญญาณอินพุตส่งผลกระทบต่อจุดเดียวของสัญญาณเอาต์พุต

เนื่องจากคุณไม่สะดวกสบายในการโน้มน้าวใจอันดับแรกให้เราตรวจสอบว่าการสนทนาแบบใดมีความหมายอย่างไรในบริบทที่ไม่ต่อเนื่องเช่นนี้

ในบริบทที่ไม่ต่อเนื่องของเราเราสามารถคูณสองสัญญาณของเราได้โดยเพียงแค่คูณแต่ละตัวอย่างที่เกี่ยวข้อง อินทิกรัลก็ง่ายที่จะแยกกันเราแค่บวกแต่ละตัวอย่างในช่วงเวลาที่เรารวมเข้าด้วยกัน การแยกกันอย่างง่ายอย่างหนึ่งคือการคำนวณค่าเฉลี่ยเคลื่อนที่ ถ้าคุณต้องการค่าเฉลี่ยเคลื่อนที่ 10 ตัวอย่างนี่อาจเป็นสัญญาณของคุณโดยการกระจาย 10 ตัวอย่างยาวและสูง 0.1 แต่ละตัวอย่างในหน้าต่างแรกจะถูกคูณด้วย 0.1 จากนั้น 10 ทั้งหมดจะถูกรวมเข้าด้วยกันเพื่อสร้าง เฉลี่ย. สิ่งนี้ยังเผยให้เห็นความแตกต่างที่น่าสนใจและสำคัญเมื่อคุณพร่ามัวด้วยการบิดการแจกแจงที่คุณใช้ควรจะรวมเป็น 1.0 กับตัวอย่างทั้งหมดมิฉะนั้นจะเพิ่มหรือลดความสว่างโดยรวมของภาพเมื่อคุณปรับใช้

ตอนนี้เราได้ดูการโน้มน้าวใจเราสามารถก้าวต่อไปเพื่อพร่าเลือน การเบลอแบบเกาส์เซียนถูกใช้งานโดยการโน้มน้าวรูปภาพโดยการกระจายแบบเกาส์เซียน ความพร่ามัวอื่น ๆ มักถูกนำไปใช้โดยการโน้มน้าวใจภาพด้วยการแจกแจงแบบอื่น เบลอที่ง่ายที่สุดคือกล่องเบลอและใช้การกระจายแบบเดียวกับที่เราอธิบายไว้ข้างต้นกล่องที่มีพื้นที่หน่วย ถ้าเราต้องการทำให้พื้นที่พร่ามัว 10x10 จากนั้นเราคูณแต่ละตัวอย่างในกล่องด้วย 0.01 แล้วรวมทั้งหมดเข้าด้วยกันเพื่อสร้างจุดศูนย์กลาง เรายังต้องแน่ใจว่าผลรวมทั้งหมดของตัวอย่างทั้งหมดในการกระจายเบลอของเราคือ 1.0 เพื่อให้แน่ใจว่าภาพจะไม่สว่างขึ้นหรือเข้มขึ้น

r

อี-x2/22π

O(n2)O(n).


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

1
หากคุณกำลังพูดกับฉันไม่ได้เลย คำตอบและเบิร์ตของคุณเป็นสิ่งที่น่าอัศจรรย์ใจ ขอบคุณมาก! ต้องแยกย่อยข้อมูลสักหน่อย (:
อลันวูล์ฟ

11

O(n2)O(n)

แต่มีสองเทคนิคเพิ่มเติมที่คุณอาจต้องการพิจารณาในการใช้งานจริง:

ตัวกรองมีรัศมีที่แน่นอนและด้วยเหตุนี้คุณจึงต้องคำนวณด้วยพิกเซลที่ตกนอกภาพ ในกรณีเช่นนี้คุณอาจจะลองหนึ่งต่อไปนี้: สำหรับพิกเซลนอกคุณก็จะใช้ค่าที่เป็นไปสุดท้าย (เช่นพิกเซลที่ชายแดนมากเช่นเดียวกับในmax(x, 0). หรือคุณอาจจะ "สะท้อนให้เห็นถึง" ภาพต่อนอก (ในx < 0 ? -x : x) หรือคุณสามารถหยุดที่เส้นขอบได้ แต่จากนั้นคุณจะต้องปรับตัวส่วนในตัวกรองคอนโวลูชันเพื่อให้ได้ผลรวมสูงสุด 1 ตัวอย่างเช่น

รวม1256[1464141624164624362464162416414641]=รวม1225[0000001624160024361600162416000000]=1
     1
    1 1
   1 2 1
  1 3 3 1
[1 4 6 4 1]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.