ภาพซ้อน ซ้อนภาพ


การแทนภาพด้วย Pixmap

  • ภาพหนึ่งภาพประกอบด้วยจุดภาพ (pixel) มากมาย เรียงกันเป็นแถว ๆ จากบนลงล่าง
  • แต่ละจุดภาพประกอบด้วยองค์ประกอบสี แดง เขียว และน้ำเงิน เรียกว่า R, G, B
  • แต่ละสีมีความเข้ม 256 ระดับ  (เช่นสีแดงระดับ 255 คือแดงสดสุด ๆ แต่ถ้าระดับ 0 คือไม่มีสีแดงเลย ถ้าต้องการสีม่วงสดสุด ๆ ก็ให้ R=255, G=0, B=255)
  • เราสามารถแทนหนึ่งจุดภาพด้วย int  1 ตัว ดังนี้
    • เนื่องจาก 28 = 256 ถ้าต้องการเก็บจำนวนเต็ม 0 ถึง 255 จึงใช้เนื้อที่เพียง 1 ไบต์ ดังนั้นแต่ละจุดภาพใช้เนื้อที่เก็บ 3 ไบต์ (1 ไบต์แทน 1 สี)
    • เนื่องจาก 1 int มีขนาด 4 ไบต์ ดังนั้น 1 pixel จึงแทนได้ด้วย 1 int โดยกำหนดให้
      • สีน้ำเงินใช้บิตที่ 0 ถึงบิตที่ 7  (ดูรูปข้างล่างประกอบ)
      • สีเขียวใช้บิตที่ 8 ถึงบิตที่ 15
      • สีแดงใช้บิตที่ 16 ถึงบิตที่ 23
      • (ส่วนบิตที่เหลือทางขวามีไว้แทนระดับความทึบของจุดภาพ, ถ้าเป็น 255 แสดงว่าจุดภาพนี้ทึบ แต่ถ้าเป็น 0 แสดงว่าจุดภาพนี้โปร่งใสมองไม่เห็น  --- ปฏิบัติการนี้ไม่ได้ใช้ส่วนนี้)

การแทน 1 จุดภาพด้วย 1 int

  • โดยสรุป เราสามารถแทนภาพหนึ่งภาพได้ด้วยอาเรย์สองมิติของ int (int[][]) ซึ่งเรียกว่า pixel map (เรียกสั้น ๆ ว่า pixmap) โดยจุดภาพที่อยู่ที่ตำแหน่งพิกัด (x,y) ก็จะเก็บในอาเรย์ที่ช่อง [x][y]  กำหนดให้พิกัดมุมซ้ายบนสุดของภาพคือพิกัด (0,0)

การประมวลผลภาพ

    Blend 

  • เป็นโปรแกรมสร้างภาพซ้อนจากภาพสองภาพ โดยต้องกำหนดว่าจะให้ความสำคัญของภาพใดเป็นเท่าไร
  • ชุดภาพข้างล่างนี้ คือผลการสร้างภาพซ้อนของภาพแมวกับภาพเด็ก ให้ a คือความสำคัญของภาพแมวที่จะปรากฏในภาพซ้อน

a = 0.0

a = 0.25

a = 0.50

a = 0.75

a = 1.0

a = 0.0

a = 0.25

a = 0.50

a = 0.75

a = 1.00

  • แต่ละสีของจุดภาพของภาพซ้อนคำนวณได้จาก a * pCat + (1 - a) * pBaby โดยใช้สูตรนี้กับแต่ละสีของจุดภาพ แล้วค่อยรวมทั้งสามสีที่คำนวณได้ให้กับภาพผลลัพธ์

    ChromaKey

  • เป็นโปรแกรมซ้อนภาพหน้าฉากกับภาพหลังฉาก โดยกำหนดให้ภาพหน้าฉากมีสีพิเศษ (เรียกว่า chroma key) อยู่ ณ ตำแหน่งที่ต้องการให้ภาพหลังฉากปรากฏ
  • ดังตัวอย่างข้างล่างนี้  ภาพซ้ายมือคือภาพหน้าฉากที่มีสีเขียวสดเป็น chroma key เมื่อนำมาซ้อนภาพกับภาพหลังฉากตรงกลาง จะได้ผลลัพธ์ดังภาพทางขวามือ

foreground

background

Bird + Sky

รูป + สีเขียวเป็น key

รูปพื้นหลัง

รูปหลังการซ้อนภาพ

สิ่งที่ต้องการ

  • เขียนเมท็อด blend ในคลาส Blend

int[][] blend(int[][] b1, int[][] b2, double a)

    • blend รับ b1 และ b2 ซึ่งเป็น pixmap ของภาพสองภาพ พร้อมกับค่า a ที่แทนความสำคัญของภาพ b1
    • สร้าง คำนวณ และคืน int[][]  ซึ่งคือ pixmap ของภาพซ้อนผลลัพธ์
          
  • เขียนเมท็อด greenChromaKey ในคลาส ChromaKey

int[][] chromaKey(int[][] fg, int[][][] bg, int c)

    • fg คือ pixmap ของภาพหน้าฉาก ส่วน bg เป็นของภาพหลังฉาก
    • c คือสีที่เป็น chroma key ในภาพ fg
    • สร้าง คำนวณ และคืน int[][]  ซึ่งคือ pixmap ของการซ้อนภาพทั้งสอง
          
  • หมายเหตุ
    • มีคลาส Mirror ให้ดูเป็นตัวอย่าง เป็นคลาสที่ทำการสร้างภาพใหม่ที่เกิดการนำภาพครึ่งซ้ายมาทับภาพครึ่งขวาแบบ "ส่องกระจก" ลองสั่งทำงานดู

การตรวจให้คะแนน

  • ต้องการสั่งทำงานคลาสใด ก็เลือกคลาสนั้นแล้วกด F5
  • ต้องการให้ระบบทดสอบและให้คะแนน ให้กดปุ่ม F6

คะแนนเต็ม : 10 คะแนน

เวลาปฏิบัติการ : 60 นาที