想請問讀raw檔與彩色轉灰階的問題 |
尚未結案
|
wolfs
一般會員 發表:2 回覆:5 積分:1 註冊:2004-10-06 發送簡訊給我 |
大家好,我是接觸影像處理的新手
想請問大家一個我很頭痛的問題
現在正在研究用java來處理raw檔的顯示與轉換
我手上有一個範例是讀raw檔的RGB pixels值 它是用byte陣列來存
(Q1)我看過有些是用int[]來存,就不用存3次是為什麼呢? DataInputStream din =new DataInputStream(new FileInputStream(filepath));
pic = new byte[width][height][3];
for (int y = 0; y < height; y ) {
for (int x = 0; x < width; x ) {
for (int channel = 0; channel < 3; channel ) {
pic[x][y][channel] = din.readByte();
}
}
} 然而,raw檔讀進來了之後,接著要轉成圖檔,所以下面這段依我所見應該就是去處理每個點的pixcel值。 for (int y = 0; y < height; y ) {
for (int x = 0; x < width; x ) {
R = pic[x][y][0];
G = pic[x][y][1];
B = pic[x][y][2];
pixels[y * width x] = ( (B & 0xff) |
( G & 0xff00) |
( (R << 16) & 0xff0000) |
0xff000000);
}
} 不過這段程式碼真的很讓我頭痛>_<
我一直沒辦法看懂
(B & 0xff) |( G & 0xff00) |( (R << 16) & 0xff0000) |0xff000000 (Q2)這一段所處理的動作,以及它最後的pixels[y * width x]值到底是長什麼樣子? 因為我對於RGB的結構最清楚的就是(255,255,255)十進制的表示法
而像pixels[y * width x]最後是一個int的值,它是為什麼呢? 然後最後是轉灰階的問題
我看了網路上的資料都是說把RGB相加除3就可以得到灰階值了
不過 我程式碼改成這樣子,看起來會怪怪的,不知是哪邊有問題@@拜託各位先進給我一些觀念或答案,謝謝
Gray = (R G B)/3;
pixels[y * width x] = ( (Gray & 0xff) |
( Gray & 0xff00) |
( (Gray << 16) & 0xff0000) |
0xff000000);
|
wolfs
一般會員 發表:2 回覆:5 積分:1 註冊:2004-10-06 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
wolfs 您好: Q1:(B & 0xff) | ( (G<<8) & 0xff00) | ( (R << 16) & 0xff0000) | 0xff000000
在Java中pixel的顏色值,是以整數(int)的方式儲存,而共長4個bytes,顏色的儲存規則是:int AARRGGBB,其中的AA表示Alpha,簡單的說就是透明度(0:完全透明,255:不透明);其餘應該不用再解釋了。
所以上述算式的目的就是:將顏色的ARGB分量整合至一個整數中。
ARGB所在的bit分別是:B:(0~7),G:(8~15),R:(16~23),A:(24~31),所以才有上述的算式,而且Java並沒有提供類似的unsigned型態,因此利用or(|)運算是必較不會發生錯誤的。 Q2: pixels[y * width x]
表示影像第(y 1)列,第(x 1)行的pixel,列與行的索引(index)假設均由0開始。 Q3: color => gray 的公式
int gray = (int) (0.299*R 0.587*G 0.114*B);
如果您要將其填入pixel中(R=G=B=gray),其結果應該是:
pixels[y * width x] = (gray & 0xff) | ( (gray<<8) & 0xff00) | ( (gray << 16) & 0xff0000) | 0xff000000; RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
wolfs
一般會員 發表:2 回覆:5 積分:1 註冊:2004-10-06 發送簡訊給我 |
謝謝RichTop回我之前的問題^^ 受益良多 我有試著把我的彩色圖檔轉成灰階
但是我用System.out.print去觀看我的pixels[y * width x]值和gray值 pixels[y * width x] = ( (gray & 0xff) |( gray << 8 & 0xff00) |( (gray << 16) & 0xff0000) |0xff000000); 它有的是呈現負值,這是正常還是可能有什麼問題嗎?
因為我開彩色圖就會看起來有點怪
不過開本來就是灰階的圖就感覺都ok 謝謝
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
wolfs
一般會員 發表:2 回覆:5 積分:1 註冊:2004-10-06 發送簡訊給我 |
RichTop謝謝您回答我的問題 不好意思這麼晚才來回
因為我有再去問其他同學,而這個問題也解決了 他的回答是:
R = pic[x][y][0]”,但因為pic是byte只佔1個byte,而int佔有4個byte,所以會造成int的前三個byte是沒有值的。
我覺得java對於extension是用補1的方式,也就是int前三個byte的位置java會自動補1,就造成R =pic[x][y][0]的時候會有負數出現。
所以我在程式中再另外設int r,g,b,讓r,g,b為:
r = R & 0xff; g = G & 0xff; b = B & 0xff;
這樣r,g,b就可以是正常的正數了。 如此就可以解決我這個問題了^^
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |