天天看點

圖像進行中像素點的問題:unsigned char 和 char

以前在做圖像處理的時候,一直不太在意這個問題,對圖像每個像素點的灰階值,總是認為char也可,unsigned char也可。盡管它們都是8位,但是表示的數的範圍卻不相同:char: -128~127, unsigned char: 0~255。很明顯,unsigned char才是正确的選擇。

你可以這樣定義: 1 struct { 2     char r; 3     char g; 4     char b; 5 }pixel_t; 6 也可以這樣定義: 8 struct { 9     unsigned char r; 10     unsigned char g; 11     unsigned char b; 12 }pixel_ut;

如果你不用上面的定義對像素進行算術運算,而隻是進行指派操作,OK, 沒問題。 但一旦進行算術運算,隐含的bug随之而來了。

考慮下面的情況:

2 struct pixel_t pix1;

3 struct pixel_t pix2;

4 struct pixel_ut pix3;

5 struct pixel_ut pix4;

7 int ans0, ans1;

8

9 pix1.r = 127;

10 pix2.r = 129;

11

12 pix3.r = 127;

13 pix4.r = 129;

14

15 ans0 = pix2.r - pix1.r; //ans0 = ?

16

17 ans1 = pix4.r - pix3.r; //ans1 = ? 

如果你認為ans0與ans1的值會相等,那你就大錯特錯,他們不僅不等,而且兩者相差甚遠。 

ans0 = -254; 

ans1 = 2; 

原因在于: 

當我們把129指派給pix2.r時,由于pix2.r的類型是char,是以pix2.r的值并不是129,而是 

-127。是以當我們進行運算時出錯。

繼續閱讀