ภาพซ้อน ซ้อนภาพ
การแทนภาพด้วย 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 แสดงว่าจุดภาพนี้โปร่งใสมองไม่เห็น --- ปฏิบัติการนี้ไม่ได้ใช้ส่วนนี้)

-
โดยสรุป เราสามารถแทนภาพหนึ่งภาพได้ด้วยอาเรย์สองมิติของ 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.00 |
ChromaKey
-
เป็นโปรแกรมซ้อนภาพหน้าฉากกับภาพหลังฉาก โดยกำหนดให้ภาพหน้าฉากมีสีพิเศษ (เรียกว่า chroma key) อยู่ ณ ตำแหน่งที่ต้องการให้ภาพหลังฉากปรากฏ
-
ดังตัวอย่างข้างล่างนี้ ภาพซ้ายมือคือภาพหน้าฉากที่มีสีเขียวสดเป็น chroma key เมื่อนำมาซ้อนภาพกับภาพหลังฉากตรงกลาง จะได้ผลลัพธ์ดังภาพทางขวามือ

|

|

|
รูป + สีเขียวเป็น 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 นาที
การทดสอบย่อยนี้ใช้ซอฟต์แวร์ปฏิบัติการจาวา JLab (http://www.cp.eng.chula.ac.th/~somchai/JLab)
|