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;