2011-09-18 49 views
0

在Efford的CD有灰度圖像量化代碼:圖像量化

int n = 8 - numBits;//numBits will be taken as input 
float scale = 255.0f/(255 >> n); 
byte[] tableData = new byte[256]; 
for (int i = 0; i < 256; ++i) 
    tableData[i] = (byte) Math.round(scale*(i >> n)); 
LookupOp lookup = 
new LookupOp(new ByteLookupTable(0, tableData), null); 
BufferedImage result = lookup.filter(getSourceImage(), null); 
return result; 

我想這個代碼轉換爲24位彩色圖像。 但不知道我是否正確?

我的嘗試: int n = 24 - numBits;

float scale = 16777216.0f/(16777216 >> n); 
    byte[] tableData = new byte[16777216]; 
    for (int i = 0; i < 16777216; ++i) 
     tableData[i] = (byte) Math.round(scale*(i >> n)); 
    LookupOp lookup = 
    new LookupOp(new ByteLookupTable(0, tableData), null); 
    result = lookup.filter(img2, null); 
    //return result; 

,這給結果圖像化,直到加numBits> = 17,如果加numBits < 17然後我得到完整的黑色圖像。 我正確嗎?

請大家幫忙。 非常感謝。 :)

回答

1

該代碼僅量化灰度圖像,而不是彩色圖像。這意味着它一次只能處理一個顏色通道。另外,如果你在做24bit→8bit,你可能想要構造一個調色板而不是簡單的量化。

+0

感謝JPA 後來我讀lookup.filter照顧彩色圖像模型 的我只想量化彩色圖像使用類似的邏輯 –

+0

公衆最終BufferedImage的過濾器(SRC的BufferedImage, 的BufferedImage DST) 執行上的查找操作的BufferedImage。如果源圖像中的顏色模型與目標圖像中的顏色模型不同,則將在目標中轉換像素。如果目標圖像爲空,則會使用適當的ColorModel創建BufferedImage。如果LookupTable中的數組數量不符合上面的類註釋中所述的限制,或者源圖像具有IndexColorModel,則可能會拋出IllegalArgumentException。 –