เพื่อลดปัญหาดังกล่าว สำหรับรูปสีเทาที่มีแค่ 256 สี นิยมใช้ Lookup Table ที่เป็นตารางเก็บค่าผลลัพธ์ของพิกเซลที่มีค่า 0-255 ไว้ จากนั้นจึงนำมาเปรียบเทียบกับรูป ซึ่งจะทำให้การประมวลผลได้เร็วขึ้น (อาจจะใช้หน่วยความจำเพิ่มขึ้นเล็กน้อย)
ตัวอย่างเช่น รูปสีเทารูปหนึ่งมีขนาด 512x512 พิกเซล แต่ละพิกเซลต้องการการประมวลผล 2 วินาที เวลาที่ใช้ทั้งหมดคือ 2^19 วินาที
ถ้าใช้ Lookup Table ขนาด 1x256 จะใช้เวลาในการประมวลผล 2^9 วินาที บวกกับการให้ค่าจากตารางอีกนิดหน่อย รวมแล้วก็จะน้อยกว่าวิธีปกติมาก
ลองสังเกตการเพิ่ม contrast ของรูป 50% และหา inverse โดยใช้วิธีปกติ และ ใช้ Lookup Table
1. วิธีปกติ
public void run(ImageProcessor ip){ int MN = ip.getPixelCount(); for(int p=0;p<MN;p++){ int v = ip.get(p); v = (int) Math.round(1.5*v); //50% increase of contrast if(v>255) //clamp max v = 255; v = 255-v; //inverse ip.set(p,v); } }
2. Lookup Table
public void run(ImageProcessor ip){ int K = 256; //gray level int[] LUT = new int[K]; //lookup table for(int i=0;i<K;i++){ int v = (int) Math.round(i*1.5); //increase contrast 50% if(v>255) //clamp max v = 255; v = 255-v; //inverse LUT[i] = v; } //look for value in lookup table int MN = ip.getPixelCount(); for(int p=0;p<MN;p++){ ip.set(p,LUT[ip.get(p)]); } //ip.applyTable(LUT); is better for this loop }
ซึ่งจากการเปรียบเทียบเมื่อทดสอบบนรูปสีเทาขนาด 256x256 พิกเซล พบว่า ใช้เวลาในการประมวลผล = 0.011 และ 0.006 วินาทีตามลำดับ
หมายเหตุ เราสามารถใช้คำสั่งเพื่อให้ค่าจาก Lookup Table โดยตรงแทนลูปที่สอง โดยใช้คำสั่ง ip.applyTable(LUT); ได้
No comments:
Post a Comment