我正在从头开始实现2D相关代码,我有一个简单的3x3图像矩阵,类型为unsigned char:
unsigned char Image = [184 0 35
48 107 193
29 166 32]
我的相关内核
Kernel = [-1 0 1]
现在,当我执行相关时,第一行的结果在数学上是-149,但打印结果是107(2' s补码)。
unsigned char res = -1.F *(Kernel[i-1]) + (Kernel[i+1]);
这不是一个错误吗?如何将结果保存为-149,但类型仍然保留为unsigned char? 我知道我的问题可能不合适,因为unsigned char的范围是0到255,但我想确定我是否遗漏了一些东西。我也知道负数被转换成2的补码 顺便说一下,这不是任何功课,我只是从图像处理的角度来研究C / C ++。
答案 0 :(得分:3)
不要这样做。使用带符号的整数类型。如何将结果保存为-149但类型仍保留为unsigned char?
如果内存使用量增加不是问题,请使用int
如果做不到这一点,请使用short
。
答案 1 :(得分:1)
在范围[0 max]的图像上计算渐变[-X 0 X]时,结果在[-X max,X max]范围内。根据您的需求和约束,有不同的方法来处理它:
答案 2 :(得分:0)
现在,当我执行相关时,第一行的结果在数学上是-149,但打印结果是107(2的补码)。这不是一个错误吗?
res
在无符号变量中保存负值,例如res
,不会更改unsigned char
的类型。它永远是UCHAR_MAX + 1
。通过重复添加/(或减去)unsigned char
(256)来转换负值,直到它在107
范围内,或者在这种情况下:res
。
要保存负值并在Type Range of Type
signed char at least [-127 to 127] Varies by platform
signed short at least [-32767 to 32767] Varies by platform
int8_t exactly [-128 to 127]
int16_t exactly [-32768 to 32767]
中保留负值,请使用符合范围要求的签名类型:
{{1}}