[問題] 關於unsigned char如何比大小

看板C_and_CPP (C/C++)作者 (邦)時間16年前 (2009/10/27 09:58), 編輯推噓5(5021)
留言26則, 3人參與, 最新討論串1/1
我想要讀入一個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

10/27 10:04, , 1F
newimg已經存成unsigned char,不可能比255大。
10/27 10:04, 1F

10/27 10:05, , 2F
要在存進去之前就先檢查
10/27 10:05, 2F

10/27 10:31, , 3F
計算過程可能uchar不夠放就用比較大的變數型態暫存.
10/27 10:31, 3F

10/27 10:32, , 4F
不然等到寫回uchar array以後才判斷就沒意義了@_@"
10/27 10:32, 4F

10/27 18:40, , 5F
樓上兩位大大 所以我才用一個較大的變數型態double a暫存
10/27 18:40, 5F

10/27 18:41, , 6F
而且再存進去之前先檢查 我的意思是這樣會產生warning....
10/27 18:41, 6F

10/27 18:56, , 7F
貼一下code來看, 從你貼出來的部份看不出有做這種事@_@"
10/27 18:56, 7F

10/27 18:57, , 8F
你的warning發生在 if(newimg[i][j]>255) 這行, 它明白
10/27 18:57, 8F

10/27 18:58, , 9F
說, newimg[i][j]是uchar, 最大就255, 你判斷它有沒有大
10/27 18:58, 9F

10/27 18:59, , 10F
於255這肯定會fail. <0也一樣, 一個值域在0~255的變數,
10/27 18:59, 10F

10/27 18:59, , 11F
(array中的一個element在這裡可以當一個變數來看待)
10/27 18:59, 11F

10/27 19:00, , 12F
你判斷它是否<0或者>255這些都肯定都是false(上面錯字).
10/27 19:00, 12F

10/27 19:03, , 13F
我看到後半段的問題了Orz 在算好的double assign給
10/27 19:03, 13F

10/27 19:04, , 14F
uchar變數前用顯示轉型, 如img = (uchar)(a + 0.5);
10/27 19:04, 14F

10/27 19:04, , 15F
+0.5是四捨五入, 你自己依需求決定有沒有必要吧:)
10/27 19:04, 15F

10/27 19:05, , 16F
warning是提醒你你的assignment可能有忽略到這個問題,
10/27 19:05, 16F

10/27 19:05, , 17F
強轉型就是跟compiler說, 我就要這麼做, 聽我的就對了XD
10/27 19:05, 17F

10/27 19:11, , 18F
謝謝V大 之前學C++時沒學過「顯示轉型」 所以說如果不+0.5
10/27 19:11, 18F

10/27 19:11, , 19F
它會無條件捨去嗎?
10/27 19:11, 19F

10/27 19:14, , 20F
忘了是顯式還是強制轉型, 小弟沒看原文書, 術語請其他大
10/27 19:14, 20F

10/27 19:15, , 21F
大補充吧XD 是的, 基本型態浮點轉整數一定無條件捨去:)
10/27 19:15, 21F

10/27 19:16, , 22F
剛想到, 考慮有負數, 還是說round_to_zero好了....@_@"
10/27 19:16, 22F

10/27 19:29, , 23F
十分感謝V大 剛剛試成功了! 最近在學ICS影像處理的專題
10/27 19:29, 23F

10/27 19:30, , 24F
C++很多都忘了 剛剛爬V大文章似乎對影像頗有研究 以後請多
10/27 19:30, 24F

10/27 19:31, , 25F
多指教!
10/27 19:31, 25F

10/27 19:41, , 26F
什麼??對影像處理有研究!?那你一定是認錯人了....XD
10/27 19:41, 26F
文章代碼(AID): #1AvbEmjU (C_and_CPP)
文章代碼(AID): #1AvbEmjU (C_and_CPP)