作者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
1F:→ blexx:newimg已经存成unsigned char,不可能比255大。 10/27 10:04
2F:→ blexx:要在存进去之前就先检查 10/27 10:05
3F:推 VictorTom:计算过程可能uchar不够放就用比较大的变数型态暂存. 10/27 10:31
4F:→ VictorTom:不然等到写回uchar array以後才判断就没意义了@_@" 10/27 10:32
5F:→ ray3226:楼上两位大大 所以我才用一个较大的变数型态double a暂存 10/27 18:40
6F:→ ray3226:而且再存进去之前先检查 我的意思是这样会产生warning.... 10/27 18:41
7F:推 VictorTom:贴一下code来看, 从你贴出来的部份看不出有做这种事@_@" 10/27 18:56
8F:→ VictorTom:你的warning发生在 if(newimg[i][j]>255) 这行, 它明白 10/27 18:57
9F:→ VictorTom:说, newimg[i][j]是uchar, 最大就255, 你判断它有没有大 10/27 18:58
10F:→ VictorTom:於255这肯定会fail. <0也一样, 一个值域在0~255的变数, 10/27 18:59
11F:→ VictorTom:(array中的一个element在这里可以当一个变数来看待) 10/27 18:59
12F:→ VictorTom:你判断它是否<0或者>255这些都肯定都是false(上面错字). 10/27 19:00
13F:推 VictorTom:我看到後半段的问题了Orz 在算好的double assign给 10/27 19:03
14F:→ VictorTom:uchar变数前用显示转型, 如img = (uchar)(a + 0.5); 10/27 19:04
15F:→ VictorTom:+0.5是四舍五入, 你自己依需求决定有没有必要吧:) 10/27 19:04
16F:→ VictorTom:warning是提醒你你的assignment可能有忽略到这个问题, 10/27 19:05
17F:→ VictorTom:强转型就是跟compiler说, 我就要这麽做, 听我的就对了XD 10/27 19:05
18F:→ ray3226:谢谢V大 之前学C++时没学过「显示转型」 所以说如果不+0.5 10/27 19:11
19F:→ ray3226:它会无条件舍去吗? 10/27 19:11
20F:推 VictorTom:忘了是显式还是强制转型, 小弟没看原文书, 术语请其他大 10/27 19:14
21F:→ VictorTom:大补充吧XD 是的, 基本型态浮点转整数一定无条件舍去:) 10/27 19:15
22F:→ VictorTom:刚想到, 考虑有负数, 还是说round_to_zero好了....@_@" 10/27 19:16
23F:→ ray3226:十分感谢V大 刚刚试成功了! 最近在学ICS影像处理的专题 10/27 19:29
24F:→ ray3226:C++很多都忘了 刚刚爬V大文章似乎对影像颇有研究 以後请多 10/27 19:30
25F:→ ray3226:多指教! 10/27 19:31
26F:推 VictorTom:什麽??对影像处理有研究!?那你一定是认错人了....XD 10/27 19:41