หน้าแรก · Lab · Color

C7 Saturation กับ luma

ลดสีโดยความสว่างไม่เปลี่ยน

Color · ~5 นาที · ฟรี

1 อธิบาย

Saturation ดึงสีเข้าหาค่าความสว่าง (luma) ของพิกเซลนั้น ค่า 0 = ขาวดำ ค่า 1 = เท่าเดิม เกิน 1 = สีจัดขึ้น ตาคนไวต่อเขียวที่สุด สูตร Rec.709 จึงให้น้ำหนักเขียว 0.7152

ลองดัน saturation สูงมาก ๆ ช่องที่น้อยที่สุดจะติดลบ ซึ่งเป็นค่าที่จอแสดงไม่ได้ ต้องระวังเวลาเร่งสี

L = 0.2126 r + 0.7152 g + 0.0722 b · out = L + s · (x − L)

2 ลงมือใน mini compositor

โจทย์: ทำ plate ให้เป็นขาวดำแบบความสว่างคงเดิม

SkyVFX mini compositor · C7640×360 · float · 1001

3 เจาะลึก

สูตรเดียว ใช้ได้ทั้งลดและเพิ่มสี

Saturation หาค่า luma ของพิกเซลก่อน แล้วให้แต่ละช่องเลื่อนตามเส้นตรงระหว่างค่าเดิมกับเทาที่มี luma เท่ากัน s = 0 คือหยุดที่เทา s = 1 คือค่าเดิม s มากกว่า 1 คือเลยค่าเดิมออกไปอีกทาง

ตัวอย่างพิกเซลท้องฟ้าสีฟ้าใน plate ทะเลทราย (0.12, 0.18, 0.26) มี luma 0.173 ทุกค่า s ในตาราง luma ยังเป็น 0.173 เท่าเดิม เพราะน้ำหนักสามตัวรวมกันได้ 1 พอดี

srgb
00.1730.1730.173
0.50.1470.1770.217
1 (เดิม)0.120.180.26
20.0670.1870.347
3.5−0.0130.1970.477

ทำไมต้องเป็น luma ไม่ใช่ค่าเฉลี่ย

ไฟ LED สีน้ำเงินบนหุ่นยนต์ CG ค่า (0.05, 0.1, 1.0) ตาเห็นว่ามืดพอสมควร เพราะตาไวต่อน้ำเงินน้อย luma ของมันคือ 0.154 แต่ค่าเฉลี่ยคือ 0.383 ถ้าทำขาวดำด้วยค่าเฉลี่ย ไฟน้ำเงินเข้มจะกลายเป็นเทาอ่อน ดูสว่างผิดจากที่ตาเห็น

น้ำหนัก 0.2126 / 0.7152 / 0.0722 เป็นของ primaries แบบ Rec.709 และ sRGB ถ้า working space ของงานเป็น ACEScg น้ำหนักจะต่างไป (เขียวยังหนักสุด) ให้เลือกตามที่ pipeline ใช้

luma คงที่ไม่ได้แปลว่าตาเห็นสว่างเท่ากันเป๊ะ สีจัดมาก ๆ มักดูสว่างขึ้นนิดหนึ่ง ตัดสินด้วยตาด้วย

จุดที่สีเริ่มติดลบ

เมื่อเร่ง s ช่องที่น้อยที่สุดจะถูกดันลงต่ำกว่า luma เรื่อย ๆ จนข้าม 0 จุดข้ามคือ s = L ÷ (L − ช่องที่น้อยสุด) ท้องฟ้าตัวอย่างข้ามที่ s ≈ 3.26

สีที่จัดอยู่แล้ว เช่นไฟ LED ประกายไฟ HDR หรือป้ายนีออน ช่องที่น้อยสุดใกล้ 0 อยู่แล้ว จึงติดลบเร็วกว่ามาก ไฟ LED น้ำเงินบนหุ่น (0.05, 0.1, 1.0) ข้าม 0 ที่ s ≈ 1.5 เท่านั้น

  1. 1เร่ง saturation
  2. 2ช่องน้อยสุดต่ำกว่า 0
  3. 3จอแสดงเป็นดำ
  4. 4merge/grade ต่อแล้วเพี้ยน

Saturation ในช็อตจริง

แสงน้อย สีก็น้อย ช็อตกลางคืนหรือในเงา CG ที่สีจัดกว่า plate จะดูแปะทันที ถ้าต้องการสี ให้มาจากแหล่งแสงเล็ก ๆ เช่นไฟบนตัวหุ่น ไม่ใช่ทั้งตัว

เทคนิคตรวจ: ต่อ Saturation ค่าราว 3 ไว้ที่สายดูอย่างเดียว สีที่ไม่เข้าพวกจะโผล่ชัด เช่นขอบเขียวที่เหลือหรือ CG ที่อมสีต่างจาก plate ดูเสร็จแล้วพักตาสักครู่ก่อนตัดสินสี

ในโหมด Rec 709 สูตรนี้เป็นการคูณ matrix 3×3 จึงได้ผลเท่ากันทั้งก่อนและหลัง premult ส่วนโหมด maximum ถ้าเร่งสีจะดันค่าติดลบได้แรงและเร็วกว่ามาก เร่งด้วยโหมดนี้แล้วต้อง probe หาค่าติดลบเสมอ

4 ในงานจริง

ทำใน Nuke

  1. Saturation: ปรับ saturation และเช็กว่า luminance math เป็น Rec 709 (ค่าเริ่มต้น)
  2. ทำขาวดำเพื่อตรวจ: Saturation = 0 ต่อแยกสาย ดูผ่าน Viewer อย่าต่อเข้า Write
  3. Saturation test: Saturation ราว 3 ที่สายดูอย่างเดียว เพื่อหาสีที่ไม่เข้าพวก
  4. ใช้ mask input ของ Saturation เพื่อจำกัดพื้นที่ เช่นลดสีเฉพาะเงาใต้หุ่น
  5. หลังเร่งสีมาก ๆ: Expression ตั้ง alpha = r<0 || g<0 || b<0 เพื่อหาพิกเซลติดลบ (ดู C9)

พลาดบ่อย → แก้ยังไง

  • ✗ ทำขาวดำด้วยค่าเฉลี่ยหรือโหมด maximum✓ ใช้ Rec 709 (หรือน้ำหนักของ working space) ความสว่างที่ตาเห็นจะคงอยู่
  • ✗ เร่ง saturation ประกายไฟ HDR จนช่องน้ำเงินติดลบ✓ เร่งนิดเดียว หรือเพิ่มสีด้วย Grade gain ต่อช่องแทน แล้ว probe เช็กค่าติดลบ
  • ✗ ลืม Saturation test ค่า 3 ต่อค้างไว้จนออกไปกับไฟล์ส่ง✓ ใส่ตัวตรวจไว้ที่สาย Viewer เท่านั้น และตั้งชื่อให้ชัด
  • ✗ เร่งสี CG ในช็อตแสงน้อย “ให้ดูเด่น”✓ แมทช์ saturation กับ plate แล้วให้สีมาจากแหล่งแสงเล็ก ๆ แทน

เช็กก่อนส่งช็อต

  • luminance math ตรงกับ working space
  • ไม่มีพิกเซลติดลบหลังเร่งสี (probe สีที่จัดที่สุด)
  • Saturation test ไม่เจอสีแปลกปลอมใน CG หรือขอบ key
  • CG ในเงาไม่สีจัดกว่า plate
  • ตัวตรวจทั้งหมดอยู่นอกสายที่ไป Write

5 เช็กตัวเอง

เช็กตัวเอง 1 ข้อ

ทำไมสูตร luma ให้น้ำหนักเขียวมากที่สุด

สิ่งที่ได้เรียน

🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด

คำถามเพิ่ม

1. พิกเซล (0.2, 0.35, 0.6) ผ่าน Saturation (Rec 709) ค่า 2 luma ของผลลัพธ์เป็นเท่าไร

2. ทำขาวดำด้วยค่าเฉลี่ย (r+g+b)/3 แล้วไฟ LED น้ำเงินบนหุ่นกลายเป็นเทาอ่อน ทำไม

ตัวเลขมาจากไหน: ภาพคำนวณในเบราว์เซอร์ Saturation, Multiply, Clamp, Invert, Keymix, Copy และ Grade ตรงกับ Nuke 17.0v2 (ตรวจแล้ว) ส่วน Blur, Defocus, Glow, Sharpen, ChromaticAberration, Vignette, LensDistort, Grain, Erode, Toe, Keyer และ Despill เป็นแบบสอนหลักการ ไม่เท่า node ใน Nuke เป๊ะ Transform ในห้องนี้ก็เป็นแบบสอนหลักการเช่นกัน ใช้ bilinear ไม่ concatenate และตัดขอบที่เฟรม ภาพเป็นเรนเดอร์ Blender ของเราเอง (green screen สร้างด้วยโค้ดล้วน ฉากทะเลทรายใช้ภูเขาจาก Gaea 2.3 ท้องฟ้าเป็น HDRI CC0 จาก Poly Haven หินและหญ้าจาก Poly Haven CC0 ทรายและหินผาจาก Quixel และ rig หุ่นจาก Mixamo โดย Quixel และ Mixamo ใช้ในเรนเดอร์เท่านั้น)