QA/QC Bitpacking
QA/QC Bitpacking Explained
Integers are stored in computer memory in binary format. Binary is a string of values which are either 0 or 1, with each place referred to as a "bit". The more bits in a binary string, the more information can be stored. A binary string of two bits can have the following four integer values:
Binary | Integer |
---|---|
00 | 0 |
01 | 1 |
10 | 2 |
11 | 3 |
A binary string of three bits can have the following eight integer values:
Binary | Integer |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
Thus, the maximum integer value is a function of the number of bits used, which is (2^n)-1
, where n
is the number of bits. Note that bits are read from right to left, and the bit "location" starts at 0. So the right-most bit is bit 0, the bit immediately to the left of that is bit 1, etc. Most QA/QC data will be either 8 or 16 bits. The above does not account for negative numbers, which are generally not seen in QA/QC data so are not explained here.
Each bit in a binary string can be thought of as a single flag which declares if a certain condition is present. For example the following describes the bit flags of the Landsat 4-7 Cloud Quality Assessment band.
Bit | Flag Description |
---|---|
0 | Dark Dense Vegetation (DDV) |
1 | Cloud |
2 | Cloud Shadow |
3 | Adjacent to cloud |
4 | Snow |
5 | Water |
6-7 | Unused |
This band has 8 bits, so is read as an 8-bit integer and has a maximum value of (2^8)-1 = 255
. The following table has several examples of possible QA integer values, their corresponding flags, and the binary value.
Pixel Value | DDV | Cloud | Cloud Shadow | Adjacent to cloud | Snow | Water | Description | Binary |
---|---|---|---|---|---|---|---|---|
2 | No | Yes | No | No | No | No | Pixel has a cloud | 00000010 |
24 | No | No | No | Yes | Yes | No | Pixel has snow and is adjacent to a cloud | 00011000 |
36 | No | No | Yes | No | No | Yes | Pixel includes water and a cloud shadow | 00100100 |
5 | Yes | No | Yes | No | No | No | Pixel had dark dense vegetation and a cloud shadow | 00000101 |
Any pixel can have multiple flags set. Thus to extract a single mask representing the "Cloud Shadow" flag, for example, would require finding values of 5, 36, and all other integers where bit 2 is set. The unpackqa package simplifies this process and makes querying one, or multiple, flags straightforward.