2010-11-17 145 views
2
import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.ImageIO; 


public class ConvertRGBtoLAB { 


    public static void main(String[] args) { 

     //get input image 
    String fileName = "IMG_7990.jpg"; 
    //read input image 
    BufferedImage image = null; 
     try 
     { 
      image = ImageIO.read(new File(fileName)); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 


     //setup result image 
     int sizeX = image.getWidth(); 
     int sizeY = image.getHeight(); 


       float r, g, b, X, Y, Z, fx, fy, fz, xr, yr, zr; 
    float ls, as, bs; 
    float eps = 216.f/24389.f; 
    float k = 24389.f/27.f; 

    float Xr = 0.964221f; // reference white D50 
    float Yr = 1.0f; 
    float Zr = 0.825211f; 

       for (int y = 0; y < image.getHeight(); y++) { 
      for (int x = 0; x < image.getWidth(); x++) { 
       int c = image.getRGB(x,y); 
       int R= (c & 0x00ff0000) >> 16; 
       int G = (c & 0x0000ff00) >> 8; 
       int B = c & 0x000000ff; 

       r = R/255.f; //R 0..1 
    g = G/255.f; //G 0..1 
    b = B/255.f; //B 0..1 

    // assuming sRGB (D65) 
    if (r <= 0.04045) 
    r = r/12; 
    else 
    r = (float) Math.pow((r+0.055)/1.055,2.4); 

    if (g <= 0.04045) 
    g = g/12; 
    else 
    g = (float) Math.pow((g+0.055)/1.055,2.4); 

    if (b <= 0.04045) 
    b = b/12; 
    else 
    b = (float) Math.pow((b+0.055)/1.055,2.4); 


    X = 0.436052025f*r  + 0.385081593f*g + 0.143087414f *b; 
    Y = 0.222491598f*r  + 0.71688606f *g + 0.060621486f *b; 
    Z = 0.013929122f*r  + 0.097097002f*g + 0.71418547f *b; 

    // XYZ to Lab 
    xr = X/Xr; 
    yr = Y/Yr; 
    zr = Z/Zr; 

    if (xr > eps) 
    fx = (float) Math.pow(xr, 1/3.); 
    else 
    fx = (float) ((k * xr + 16.)/116.); 

    if (yr > eps) 
    fy = (float) Math.pow(yr, 1/3.); 
    else 
    fy = (float) ((k * yr + 16.)/116.); 

    if (zr > eps) 
    fz = (float) Math.pow(zr, 1/3.); 
    else 
    fz = (float) ((k * zr + 16.)/116); 

    ls = (116 * fy) - 16; 
    as = 500*(fx-fy); 
    bs = 200*(fy-fz); 


       int Ls = (int) (2.55* ls + .5); 
       int As = (int) (as + .5); 
       int Bs = (int) (bs + .5); 

       int lab = 0xFF000000 + (Ls << 16) + (As << 8) + Bs; // and reassign 

       image.setRGB(x, y, lab); 

      } 
     } 


     //write new image 
     File outputfile = new File("lab.png"); 
     try { 
     // png is an image format (like gif or jpg) 
     ImageIO.write(image, "png", outputfile); 
     } catch (IOException ex) { 
     ex.printStackTrace(); 
     } 


    } 


} 

你好,RGB到CIELAB轉換

我試圖把一個RGB圖像轉換成CIELAB色彩空間(LAB)我得到一個輸出,但我不知道什麼是應該的樣子。

任何人都可以指向我已經存在的圖像轉換器,或確認我做了這個正確的?

謝謝!

+0

沒有「RGB」這樣的顏色空間。 RGB是整個類型的色彩空間。 – 2011-10-05 09:15:44

回答

0

OpenCV具有不同色彩空間之間轉換的功能。看看我的其他答案here。這是在C,你可以很容易地檢查你的代碼。

6

我個人使用this site作爲常用色彩空間之間轉換公式的快速參考。

0

你會希望確保LsAsBs鉗位在0到255之間,你必須將它們組合成單個int聲明將允許出界外值影響到其他值。

+0

a和b可以是負數。他們通常有-128 .. + 128或-100 .. + 100 – finnw 2015-04-26 16:10:32

+0

@finnw的範圍,那麼他們需要抵消。正在構造的值是無符號的。 – 2015-04-26 16:19:46