Tuesday, March 22, 2011

ImageJ 7: Pixel processing using Lookup Table

ในการประมวลผลทีละพิกเซล บางครั้งถ้าการประมวลผลซับซ้อนและมีพิกเซลจำนวนมาก ก็จะต้องเกิด computing cost + time cost ที่สูง

เพื่อลดปัญหาดังกล่าว สำหรับรูปสีเทาที่มีแค่ 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