1 อธิบาย
grain ของ plate เปลี่ยนทุกเฟรม ถ้า clone มาจากเฟรมที่มี grain แล้ว hold ไว้ grain ใน patch จะหยุดนิ่ง วิธีที่ปลอดภัยคือ paint บน plate ที่ degrain แล้ว จากนั้นเติม grain กลับไปทับงาน paint
ลองสลับ “paint patch จาก” ปรับ regrain และสลับ grain seed ระหว่าง “ค่าคงที่ (default)” กับ “เปลี่ยนทุกเฟรม” แล้วกด Play viewer แบบ grain QC บอกระดับ grain ส่วน “ต่างจากเฟรมก่อน” บอกว่า grain ขยับหรือไม่ ดูตัวเลขทั้งสองค่า: grain ใน patch ÷ รอบ ๆ และ grain ที่ขยับเฟรมต่อเฟรม ใน patch ÷ รอบ ๆ
plate = degrained + grain; out = paint + new grain (every frame)2 ลงมือลอง
ทำให้ patch หายไปตอนภาพเล่น: ทั้งสองค่าอยู่ระหว่าง 0.9–1.1×
ภาพนิ่งหลอกได้ ดู view “ต่างจากเฟรมก่อน” ขณะเล่น และคิดว่า grain ใน patch มาจากไหน มาจาก source จาก regrain หรือทั้งสองอย่าง
3 เจาะลึก
ทำไมต้อง paint บน plate ที่ไม่มี grain
grain เป็น noise ที่เปลี่ยนทุกเฟรมและทุก pixel ถ้า clone จาก plate ที่มี grain เราก็ copy grain จากที่อื่นหรือเฟรมอื่นมาด้วย ถ้าแยก grain ออกก่อน งาน paint จะสะอาด แล้วค่อยใส่ grain ที่ควบคุมได้กลับเข้าไป
plate ลบ plate ที่ degrain แล้ว (Merge from) ได้ grain ออกมา บวกกลับเข้าไปก็ได้ plate เดิม ข้อนี้ทำให้เช็กได้ว่าแยก grain ครบหรือไม่ และนอก patch ควรคืน plate ต้นฉบับไว้ grain เดิมจะไม่ถูกแตะ
- 1Denoise plate
- 2paint บน plate ที่ degrain
- 3regrain ทับงาน paint
- 4Keymix กลับบน plate เดิม
grain ที่หยุดนิ่ง
patch ที่ paint เฟรมเดียวแล้ว hold ไว้ (เช่นด้วย FrameHold) จะพา grain ของเฟรมนั้นไปทุกเฟรม บนภาพนิ่งดูถูกต้อง แต่พอเล่น grain รอบ ๆ เต้น ส่วนใน patch นิ่ง ตาจับได้ทันที
Grain2 ก็มีกับดักเดียวกัน seed เริ่มต้นเป็นค่าคงที่ grain จึงนิ่งถ้าไม่ animate seed เช่นใส่ expression ที่ขึ้นกับ frame อย่าง 134+frame*7
เช็ก grain ด้วย difference กับเฟรมก่อนหน้าขณะเล่น patch ที่นิ่งจะเป็นรูมืด
source กับ regrain ต้องไปด้วยกัน
grain สองชุดที่เป็นอิสระต่อกันไม่หักล้างกัน แต่รวมกันแรงขึ้น regrain 1× ทับ patch ที่มี grain อยู่แล้ว จะได้ grain ราว 1.4× ของรอบ ๆ และครึ่งหนึ่งยังนิ่งอยู่
| source | regrain | ผลที่เห็น |
|---|---|---|
| degrain | ไม่มี | จุดเนียนไม่มี grain |
| มี grain, hold | ไม่มี | ระดับถูก แต่นิ่งตอนเล่น |
| มี grain, hold | ประมาณ 1× | grain เกิน ราว 1.4× |
| degrain | ประมาณ 1×, seed คงที่ | ระดับถูก แต่นิ่ง |
| degrain | ประมาณ 1×, seed ทุกเฟรม | กลืนไปกับรอบ ๆ |
match ทีละ channel และดูด้วย high-pass
grain แต่ละ channel แรงไม่เท่ากัน ส่วนใหญ่สีน้ำเงินแรงที่สุด จึงควรเช็กสีน้ำเงินก่อน ใน Grain2 ความแรงคือ red_m, green_m, blue_m ส่วน red_i, green_i, blue_i คือความไม่สม่ำเสมอ ไม่ใช่ความแรง
view สำหรับ QC คือ |out − blur เล็ก ๆ| × 50 (ใน figure ใช้ box 3×3 ส่วนใน Nuke ใช้ Blur ราว size 1) ซึ่งตัดภาพออกเหลือแต่โครงสร้าง grain ระดับ grain ใน patch ควรตรงกับรอบ ๆ ภายในราว ±10% grain ของ plate จริงเปลี่ยนตามความสว่างอย่างไรขึ้นกับ plate และ colour space จึงควรเช็กทั้งในส่วนมืดและส่วนสว่าง
วัด grain จากพื้นที่ข้าง patch ที่มีความสว่างใกล้กัน ไม่ใช่จากทั้งเฟรม
4 ในงานจริง
ทำใน Nuke
- Denoise plate แล้ว paint งาน cleanup ด้วย RotoPaint บน plate ที่ degrain แล้ว ถ้าใช้ patch เฟรมเดียวให้ FrameHold ไว้
- Merge (from) plate ลบ plate ที่ degrain ได้ grain ของ plate ไว้ดูเทียบ
- Grain2 บน patch: ตั้ง red_m, green_m, blue_m ทีละ channel เริ่มที่สีน้ำเงิน และ animate seed ด้วย expression ที่ขึ้นกับ frame
- maskgrain เปิดอยู่โดยค่าเริ่มต้น grain จะลงเฉพาะที่ alpha ของ input มีค่า ถ้า alpha เป็น 0 Grain2 จะไม่เติมอะไรเลย
- Keymix: B = plate ต้นฉบับ, A = patch ที่ regrain แล้ว, mask = matte ของ patch นอก patch grain เดิมจะไม่ถูกแตะ
- QC: Blur size 1 แล้ว Merge (difference) กับภาพ output ขยาย ×50 ด้วย gain ของ viewer แล้วเล่นภาพ
พลาดบ่อย → แก้ยังไง
- ✗ ไม่ regrain เลย ได้จุดเนียนที่เห็นทันทีเมื่อภาพเล่น✓ เติม grain ทับงาน paint ทุกครั้ง แล้วเช็กด้วย high-pass
- ✗ regrain ทับ patch ที่ clone มาจาก plate ที่มี grain✓ ใช้ source ที่ degrain แล้ว ไม่งั้น grain จะซ้อนเป็นราว 1.4×
- ✗ hold patch จากเฟรมที่มี grain ทำให้ grain นิ่งขณะที่รอบ ๆ เต้น✓ hold patch ที่ไม่มี grain แล้วเติม grain ใหม่ทุกเฟรม
- ✗ ใช้ Grain2 ด้วย seed เริ่มต้น✓ animate seed ด้วย expression ที่ขึ้นกับ frame
- ✗ match บนภาพนิ่ง หรือดูแค่ channel สีเขียว✓ เช็กทีละ channel เริ่มที่สีน้ำเงิน และดูขณะภาพเล่นด้วย
เช็กก่อนส่งช็อต
- ใน high-pass view ระดับ grain ใน patch ตรงกับรอบ ๆ ภายในราว ±10%
- เช็กครบทั้ง red, green, blue โดยเฉพาะสีน้ำเงิน
- difference กับเฟรมก่อนหน้าขณะเล่น ไม่มีรูนิ่งตรง patch
- seed ของ Grain2 ถูก animate แล้ว
- นอก patch ยังเป็น plate ต้นฉบับพร้อม grain เดิม
- grain ใน patch ตรงกันทั้งในส่วนมืดและส่วนสว่าง
5 เช็กตัวเอง
patch ดูมี grain เท่ารอบ ๆ บนภาพนิ่ง แต่พอเล่นภาพกลับเห็นเป็นจุด สาเหตุที่น่าจะเป็นที่สุดคืออะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. regrain 1× ทับ patch ที่ clone มาจาก plate ที่มี grain จะเกิดอะไร
2. ใส่ Grain2 บน patch ระดับตรงแล้ว แต่ตอนเล่นยังเห็น patch ควรเช็กอะไรก่อน
ตัวเลขมาจากไหน: ภาพคำนวณในเบราว์เซอร์บนเรนเดอร์ Blender ของฉากทะเลทรายของเรา grain เป็นของเราเอง: Gaussian แยก channel เบลอเล็กน้อย บวกในค่า display ด้วยความแรงคงที่ต่อ channel (สีน้ำเงินแรงสุด) และสุ่มใหม่ทุกเฟรม plate ที่ “degrain” คือเรนเดอร์ที่ไม่มี grain เลย เป็น degrain สมบูรณ์แบบสอนหลักการ denoiser จริงจะเหลือ grain บ้างและทำให้รายละเอียดนุ่มลง ค่า ratio วัดในเบราว์เซอร์ ระดับ grain คือ standard deviation ของ (ผลลัพธ์ − เรนเดอร์ที่ไม่มี grain) ใน luma ส่วนการขยับคือค่าเฉลี่ยของความต่างเฟรมต่อเฟรม ทั้งสองค่าเป็น patch ÷ รอบ ๆ และช่วงที่ผ่านเป็นของเราเอง