作者ray3226 (邦)
看板C_and_CPP
標題[問題] 關於unsigned char如何比大小
時間Tue Oct 27 09:58:05 2009
我想要讀入一個raw的512*512灰階圖檔作濾波
所以byte為單位將每個pixel存進矩陣裡
又因為pixel裡面的值應為0~255而非-128~127
所以我將矩陣宣告如下
unsigned char img[512][512];
接下來因為用3*3的mask與原圖作convolution後
我把它存到一個新的矩陣(512+3-1=514)
unsigned char newimg[514][514];
後來發現因為conv出來的數值有可能超過255或低於0
於是作了如下的for loop做修正
for (int i=0; i<514; i++)
for (int j=0; j<514; j++)
{
if (newimg[i][j]>255)
newimg[i][j]=255;
else if (newimg[i][j]<0)
newimg[i][j]=0;
}
但發現build會出現
warning: comparison is always false due to limited range of data type 我想可能是char無法跟整數直接比較大小
於是用了一個很笨的方法...
重新宣告一個
double a
把img的值先assign給它再做比較
程式可以跑而且圖形也是正確的
但仍然會出現
warning: converting to `unsigned char' from `double' 想問大家要怎樣作才能讓warning不再出現
而且又可以
讓unsigned char裡頭的值比大小? 謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.35.1.66
→ blexx:newimg已經存成unsigned char,不可能比255大。 10/27 10:04
→ blexx:要在存進去之前就先檢查 10/27 10:05
推 VictorTom:計算過程可能uchar不夠放就用比較大的變數型態暫存. 10/27 10:31
→ VictorTom:不然等到寫回uchar array以後才判斷就沒意義了@_@" 10/27 10:32
→ ray3226:樓上兩位大大 所以我才用一個較大的變數型態double a暫存 10/27 18:40
→ ray3226:而且再存進去之前先檢查 我的意思是這樣會產生warning.... 10/27 18:41
推 VictorTom:貼一下code來看, 從你貼出來的部份看不出有做這種事@_@" 10/27 18:56
→ VictorTom:你的warning發生在 if(newimg[i][j]>255) 這行, 它明白 10/27 18:57
→ VictorTom:說, newimg[i][j]是uchar, 最大就255, 你判斷它有沒有大 10/27 18:58
→ VictorTom:於255這肯定會fail. <0也一樣, 一個值域在0~255的變數, 10/27 18:59
→ VictorTom:(array中的一個element在這裡可以當一個變數來看待) 10/27 18:59
→ VictorTom:你判斷它是否<0或者>255這些都肯定都是false(上面錯字). 10/27 19:00
推 VictorTom:我看到後半段的問題了Orz 在算好的double assign給 10/27 19:03
→ VictorTom:uchar變數前用顯示轉型, 如img = (uchar)(a + 0.5); 10/27 19:04
→ VictorTom:+0.5是四捨五入, 你自己依需求決定有沒有必要吧:) 10/27 19:04
→ VictorTom:warning是提醒你你的assignment可能有忽略到這個問題, 10/27 19:05
→ VictorTom:強轉型就是跟compiler說, 我就要這麼做, 聽我的就對了XD 10/27 19:05
→ ray3226:謝謝V大 之前學C++時沒學過「顯示轉型」 所以說如果不+0.5 10/27 19:11
→ ray3226:它會無條件捨去嗎? 10/27 19:11
推 VictorTom:忘了是顯式還是強制轉型, 小弟沒看原文書, 術語請其他大 10/27 19:14
→ VictorTom:大補充吧XD 是的, 基本型態浮點轉整數一定無條件捨去:) 10/27 19:15
→ VictorTom:剛想到, 考慮有負數, 還是說round_to_zero好了....@_@" 10/27 19:16
→ ray3226:十分感謝V大 剛剛試成功了! 最近在學ICS影像處理的專題 10/27 19:29
→ ray3226:C++很多都忘了 剛剛爬V大文章似乎對影像頗有研究 以後請多 10/27 19:30
→ ray3226:多指教! 10/27 19:31
推 VictorTom:什麼??對影像處理有研究!?那你一定是認錯人了....XD 10/27 19:41