23.09.2021 图像原理

23/09/2021 图像原理

像素值及其存储
像素

图像分辨率指图像中存储的信息量,决定了单位面积里的像素点个数,例如1980x1080是宽方向的像素个数乘以高方向的像素个数。整张图片可以看作是一个矩阵,而矩阵中的每个元素可以看作是对应的每个像素点的值。对于每个像素点而言,因为需要它能够表达所有的颜色,所以每个像素点要有RGB(光学三原色:Red,Green&Blue)三个值对其进行表述,每个颜色的取值范围为0-255,等同于八个bits,也就是一个byte。

像素值的存储

因为每个像素点有三个bytes的值对其进行描述,所以需要考虑如何对这三个值进行存储。因为一个byte是8位,所以三个bytes就是24位,对于整数型而言,short只有16位不满足要求,而int的24位可以满足需要,所以将三个bytes存储到一个int里。那么对于每个int类型而言,它的实际存储内容为

0000 0000 32位

1000 0000 24位,用于存储R红色

1000 0000 16位,用于存储G绿色

1000 0000 低八位,用于存储B蓝色

位运算操作符

位运算操作符:<< 左移 >> 右移 & 按位与 | 按位或 ^ 按位异或 ~ 取反

在从int数据中分别读取RGB三个颜色的值时,需要进行位运算

R >> 16;
G >> 8;
B >> 0;

但仅仅进行位运算显然并不能完成目标,例如对于绿色而言,在进行右移八位的运算后,新的数据为

0000 0000 32位

0000 0000 24位

1000 0000 16位,用于存储R红色

1000 0000 低八位,用于存储G绿色

仍然保留红色部分的数值,所以需要在移位后,仅仅取低八位的数值,这里就需要用到&(按位与)运算以及0xFF(低八位全为1的数)。对于按位与的运算结果如下

第一个数 第二个数 结果
0 0 0
0 1 0
1 0 0
1 1 1

所以对于低八位的数值而言,会保留原有的结果,而对于其他位的数值而言,结果全部为0。代码如下:

int rgb = 8421505;
//对整数rgb进行三个颜色的拆分
int red = (rgb >> 16) & 0xFF;
int green = (rgb >> 8) & 0xFF;
int blue = (rgb >> 0) & 0xFF;
上一篇:Java运算符优先级


下一篇:【无标题】