อัลกอริทึมใดที่ฉันสามารถใช้เพื่อจำลองโบเก้?


12

ฉันพยายามเขียนสคริปต์ที่วนรอบแต่ละพิกเซลในภาพถ่ายและใช้โบเก้กับภาพโดยรวม

ฉันสร้างสคริปต์ตามลิงก์นี้อย่างไรก็ตามดูเหมือนว่าจะเป็นการแฮ็ก

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

ดูเหมือน ... โอเคกับแปรงโบเก้เล็ก ๆ แต่เมื่อฉันเพิ่มขนาดแปรงโบเก้เลยก็จบลงดูเหมือนว่าจะเป็นแบบเกาส์เบลอ นี่คือภาพของสี่เหลี่ยมที่เบลอด้วยอัลกอริทึมของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

ไม่ต้องสนใจขอบสีดำฉันสามารถแก้ไขได้

คุณสามารถบอกได้ว่ามันแตกต่างจากเกาส์เซียน แต่ก็ยังห่างไกลจากสิ่งที่อาจเรียกได้ว่าโบเก้ที่มีขอบคม:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเข้าใจว่าทำไมอัลกอริทึมของฉันทำในสิ่งที่มันทำ ... ฉันจะจำลองโบเก้อย่างแม่นยำมากขึ้นได้อย่างไร



@ ฉันเข้าใจความแตกต่างเป็นอย่างมากและโดยทั่วไปแล้วโบเก้นั้นเกิดจากเลนส์และเกาส์เซียนจากกระบวนการหลังการประมวลผล แต่ฉันต้องการจำลองโบเก้
นิติบุคคล

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

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

คำตอบ:


20

ฉันคิดว่าปัญหาหลักคือช่วงไดนามิกหนึ่งอัลกอริทึมของคุณอาจถูกต้อง แต่คุณกำลังทำงานกับข้อมูลผิดประเภท

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

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

สิ่งที่คุณมีในห่วงโซ่ภาพที่แท้จริงคือ:

bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression

สิ่งที่คุณกำลังทำคือ

sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation

คุณจะไม่ได้รับผลลัพธ์ที่ถูกต้องเพราะคุณไม่ได้ทำงานกับข้อมูลเชิงเส้น

สิ่งที่คุณสามารถทำได้คือพยายามทำข้อมูลเชิงเส้นให้เปลี่ยนช่วงไดนามิกใด ๆ ที่ขาดหายไปจากการเล็มทำการจำลองโบเก้ของคุณแล้วทำซ้ำการทำงานแบบไม่เชิงเส้น!

นี่คือตัวอย่าง ฉันเริ่มต้นด้วยภาพ HDR ที่ได้รับการ tonemapped ให้ผลไม่เชิงเส้นสูง นี่เป็นประเภทภาพที่แย่ที่สุดที่จะลองจำลองโบเก้ด้วย!

การดำเนินการโน้มน้าวมาตรฐานเพื่อจำลองโบเก้ (โดยใช้เครื่องมือเบลอเลนส์ของ Photoshop) ให้ผลลัพธ์นี้ซึ่งคล้ายกับสิ่งที่คุณได้รับ:

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

 

หากคุณกำลังทำสิ่งนี้ในโค้ดให้ลองคิดค่าแต่ละค่าจากนั้นใช้รูทีนการจำลองโบเก้ของคุณจากนั้นนำคิวบ์รูทของแต่ละค่า คุณควรเห็นการปรับปรุง อาจใช้เวลาปรับแต่ง

tl; drแม้ว่าคุณจะได้นำโมเดลทางคณิตศาสตร์ที่สมบูรณ์แบบของโบเก้มาแล้วมันจะต้องนำไปใช้กับข้อมูลเชิงเส้นที่ยังไม่ได้ตัด หากคุณใช้การคำนวณแบบเดียวกันกับข้อมูลที่มีการดัดแปลงอย่างหนัก (แม้แต่มาตรฐานในกล้อง JPEG ก็ถูกแก้ไขอย่างหนักจากมุมมองทางคณิตศาสตร์) คุณจะได้รับผลลัพธ์ที่แตกต่างกันมาก


12

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

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

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


ให้การดำเนินการเป็นสารเติมแต่งทั้งหมดที่คุณจะไม่ได้รับปัญหาของพื้นที่มืดกระจายออกไป มันเป็นความจริงที่คุณต้องการหน้ากากที่คมชัดเพื่อให้ได้วงกลมที่คมชัด แต่ปัญหาสำคัญคือการใช้โบเก้ของเขากับข้อมูลที่ไม่ใช่เชิงเส้น
Matt Grum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.