1 อธิบาย
ใน plate ที่กล้องนิ่ง หุ่นยนต์เดินผ่านไป ฉากหลังจึงโผล่ให้เห็นในเฟรมอื่น median ต่อ pixel ตามเวลาจะเลือกค่าที่อยู่ตรงกลางของทุกเฟรม ได้ค่าที่อยู่นิ่งและทิ้งค่าที่ผ่านมาแค่ไม่กี่เฟรม
สลับ “รวมเฟรมด้วย” ระหว่าง mean กับ median เพิ่ม “จำนวนเฟรมที่ใช้” แล้วลองเลือกเฟรมแบบ “กระจายทั้งช็อต” แถบล่างบอกว่าเฟรมที่เลือกบังแต่ละคอลัมน์กี่ส่วน (แดง = ครึ่งหนึ่งขึ้นไป) ดูค่า “หุ่นยนต์และเงาเหลือ” กับ “grain เหลือ” ประกอบ
clean(x, y) = median over t of plate(x, y, t)2 ลงมือลอง
สร้าง clean plate ที่เหลือหุ่นยนต์และเงาไม่เกิน 8% ของหุ่นยนต์หนึ่งตัว
ดูส่วนที่เป็นสีแดงของแถบล่าง สิ่งที่ตัดสินคือ pixel ที่ถูกบังบ่อยที่สุด ไม่ใช่ค่าเฉลี่ยทั้งภาพ
3 เจาะลึก
median ต่างจาก mean อย่างไร
ลองดู pixel เดียวบนพื้นทราย เก็บค่าของมันจากทุกเฟรมที่เลือก ส่วนใหญ่เป็นทราย มีไม่กี่เฟรมที่หุ่นยนต์หรือเงาของมันเดินผ่าน median เรียงค่าแล้วหยิบตัวกลาง ค่าของหุ่นยนต์ไปกองอยู่ปลายแถว ตัวกลางจึงเป็นทราย
mean บวกทุกค่าแล้วหาร หุ่นยนต์ที่บังแค่ 1 ใน N เฟรมก็ยังเหลืออยู่ 1/N ของความต่าง เป็นเงาโปร่ง ๆ ใช้ mean ทั้ง 24 เฟรมในรูปยังเหลือหุ่นยนต์ราว 106% ของหนึ่งตัว กระจายบาง ๆ ไปตามทางเดิน
- 1เก็บค่า pixel จากทุกเฟรม
- 2เรียงค่า
- 3หยิบค่ากลาง
- 4ทำซ้ำทุก pixel
กฎครึ่งหนึ่ง: กระจายเฟรม
median ทิ้งได้เฉพาะสิ่งที่อยู่น้อยกว่าครึ่งของเฟรมที่ใช้ ในเฟรมติดกัน หุ่นยนต์เคลื่อนไปนิดเดียว pixel เดิมจึงถูกบังในเกือบทุกเฟรม ถ้าเลือกเฟรมห่างกันไปทั้งช็อต แต่ละ pixel จะถูกบังแค่ไม่กี่เฟรม
อย่าลืมเงา เงาก็เป็นสิ่งที่เคลื่อนที่เหมือนกัน ในรูปนี้หุ่นยนต์เดินเฉียง เงายาวของมันจึงกวาดไปด้านข้าง เมื่อกระจายครบ 24 เฟรม ตัวหุ่นยนต์บัง pixel ใดก็ไม่เกินราว 33% ของเฟรม และเงาไม่เกินราว 38% ถ้าเดินไปตามแนวเงา ทรายบางจุดจะอยู่ในเงาเกินครึ่งช็อต และ median จะเก็บเงาไว้
ดู pixel ที่แย่ที่สุด ถ้าจุดนั้นผ่านกฎครึ่งหนึ่ง ทั้งภาพก็ผ่าน
ถ้าจะใช้ average ต้องเจาะรูก่อน
average ก็ใช้ได้ ถ้าตัดสิ่งที่เคลื่อนที่ออกก่อน roto หุ่นยนต์เป็นรูใน alpha แล้ว premult ให้ rgb ตรงรูเป็นสีดำ จากนั้น average ทั้ง rgb และ alpha แล้ว unpremult เพื่อให้ alpha ที่ average แล้วหารความมืดตรงที่หุ่นยนต์เคยอยู่ออกไป
- 1Roto เจาะรูที่หุ่นยนต์
- 2Premult
- 3TimeEcho (average)
- 4Unpremult
grain หายไปด้วย
grain ในแต่ละเฟรมสุ่มไม่ซ้ำกัน การรวมหลายเฟรมจึงลบ grain ไปพร้อมกับหุ่นยนต์ clean plate ที่ได้จะเนียนเกิน plate จริง ต้องใส่ grain กลับ
| วิธีรวม | grain ที่เหลือ (std เทียบเฟรมเดียว) |
|---|---|
| mean ของ N เฟรม | 1/√N |
| median ของ N เฟรม | ประมาณ √(π / 2N) เมื่อ N มาก |
| mean 24 เฟรมในรูป | ราว 20% |
| median 24 เฟรมในรูป | ราว 25% |
กล้องเคลื่อนและข้อจำกัด
median ต้องใช้กับ plate ที่ locked off หรือ stabilise แล้ว ถ้ากล้องเคลื่อน ให้ stabilise ก่อน (2D หรือ 3D ด้วยการ project ผ่านกล้องที่ track) รวมเฟรม แล้วใส่การเคลื่อนกลับ
ทุก pixel ของฉากหลังต้องโผล่ให้เห็นสักช่วงในช็อต ไม่อย่างนั้นรวมเฟรมแบบไหนก็ไม่ได้ สิ่งที่หยุดนิ่งเกินครึ่งช็อตจะค้างอยู่ใน median และถ้าแสงเปลี่ยนระหว่างช็อต median จะผสมแสงหลายแบบเข้าด้วยกัน
- 1Stabilise
- 2รวมเฟรม
- 3ใส่การเคลื่อนกลับ
4 ในงานจริง
ทำใน Nuke
- Tracker: ถ้ากล้องเคลื่อน stabilise plate ก่อน แล้วใส่การเคลื่อนกลับหลังรวมเฟรม
- FrameHold หรือ TimeOffset: ดึงเฟรมที่ห่างกันไปทั้งช็อต ไม่ใช่เฟรมติดกัน
- median: ป้อนเฟรมที่กระจายแล้วเข้า median ต่อ pixel (gizmo หรือ script ขึ้นกับ setup ของแต่ละที่)
- ทางเลือก average: Roto เจาะรูที่หุ่นยนต์ → Premult → TimeEcho (ตั้งให้ average) → Unpremult
- Grain2 บน clean plate ตั้ง seed ให้เปลี่ยนทุกเฟรม เพราะค่า default ทำให้ grain ค้าง
พลาดบ่อย → แก้ยังไง
- ✗ ใช้เฟรมติดกัน หุ่นยนต์บัง pixel เดิมในเกือบทุกเฟรม✓ กระจายเฟรมไปทั้งช็อต จนทุก pixel ถูกบังน้อยกว่าครึ่ง
- ✗ ใช้ mean ตรง ๆ ทุกอย่างที่เคลื่อนที่เหลือเป็นเงาโปร่ง✓ ใช้ median หรือเจาะรูด้วย Roto แล้ว Premult ก่อน average จากนั้น Unpremult
- ✗ สิ่งที่หยุดนิ่งครึ่งช็อตค้างอยู่ใน clean plate✓ paint ส่วนนั้นด้วยมือ
- ✗ แสงเปลี่ยนระหว่างช็อต (เมฆ, flicker) แล้ว median ผสมแสงเข้าด้วยกัน✓ deflicker ก่อนรวมเฟรม
- ✗ ลืม regrain ได้ clean plate ที่สะอาดแต่เนียนเกินไป✓ ใส่ grain กลับให้ตรงกับ plate และเปลี่ยนทุกเฟรม
เช็กก่อนส่งช็อต
- plate locked off หรือ stabilise แล้วก่อนรวมเฟรม
- ไม่มีภาพซ้อนโปร่ง ๆ (ghost) ของหุ่นยนต์หรือเงาของมันเหลือ เมื่อดันค่า viewer ขึ้น
- ไม่มีสิ่งที่หยุดนิ่งค้างอยู่ ถ้ามีก็ paint ออกแล้ว
- แสงของ clean plate ตรงกับ plate ไม่มีแสงผสมจาก flicker
- regrain แล้ว grain ใกล้เคียง plate และไม่ค้างเมื่อเล่น
5 เช็กตัวเอง
ใช้ median ของ 3 เฟรมติดกัน แต่ยังเห็นหุ่นยนต์ชัด เพราะอะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. clean plate จาก median 24 เฟรมไม่มีหุ่นยนต์เหลือ แต่ดูเนียนกว่า plate จริง ควรทำอะไร
2. plate นี้กล้องเคลื่อนตลอดช็อต จะทำ clean plate ด้วย median อย่างไร
ตัวเลขมาจากไหน: ภาพ 24 เฟรมเป็นเรนเดอร์ Blender ของเราเอง (rig หุ่นยนต์เดินของเรา เดินเฉียงผ่านกล้อง locked off เก็บทุก ๆ 5 เฟรมของการเดินราว 4 วินาที) ส่งมาเป็นภาพ crop เฉพาะส่วนที่ต่างจาก clean plate ส่วน mean และ median คำนวณต่อ pixel ในเบราว์เซอร์บนค่า display เป็นแบบสอนหลักการ grain เป็นของเราเอง สุ่ม seed ใหม่ทุกเฟรม และเกณฑ์เป็นของเรา (noise ของการเรนเดอร์ระหว่างเฟรมอย่างเดียวก็ใช้ไปเกินครึ่งหนึ่งของเกณฑ์แล้ว)