全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3629
推到 Plurk!
推到 Facebook!

想請問讀raw檔與彩色轉灰階的問題

尚未結案
wolfs
一般會員


發表:2
回覆:5
積分:1
註冊:2004-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-06 13:05:39 IP:140.113.xxx.xxx 未訂閱
大家好,我是接觸影像處理的新手 想請問大家一個我很頭痛的問題 現在正在研究用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-06 13:10:18 IP:140.113.xxx.xxx 未訂閱
sorry,剛程式碼中有貼錯的地方    ( G & 0xff00)應改為( G << 8 & 0xff00)< >< >
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-06 13:59:57 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-06 14:53:30 IP:140.113.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-06 16:50:00 IP:211.76.xxx.xxx 未訂閱
wolfs 您好:    因為設了aplha所以最高位元為1,所以出現負值應屬正常。 您的程式碼,可試著加上下述紅色括號再試試。    pixels[y * width + x] = ( (gray & 0xff) |( (gray << 8) & 0xff00) |( (gray << 16) & 0xff0000) |0xff000000); RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
wolfs
一般會員


發表:2
回覆:5
積分:1
註冊:2004-10-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-08 23:32:50 IP:140.113.xxx.xxx 未訂閱
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就可以是正常的正數了。 如此就可以解決我這個問題了^^
系統時間:2024-05-09 7:52:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!