Cloud Mask
Most optical satellite imagery products come with one or more QA-bands that allows the user to assess quality of each pixel and extract pixels that meet their requirements. The most common application for QA-bands is to extract information about cloudy pixels and mask them. But the QA bands contain a wealth of other information that can help you remove low quality data from your analysis. Typically the information contained in QA bands is stored as Bitwise Flags. More info about bitmasks
In Landsat imagery, pixel quality assessment (QA_PIXEL) bands are generated by the CFMask algorithm. Different bit definitions are used because the cirrus band is only available on Landsat 8 and 9. This band is relevant to both Surface Reflectance and Surface Temperature products.
Bit |
Landat 5 & 7 |
Landsat 8 & 9 |
|---|---|---|
0 |
Fill |
Fill |
1 |
Dilated Cloud |
Dilated Cloud |
2 |
Unused |
Cirrus |
3 |
Cloud |
Cloud |
4 |
Cloud Shadow |
Cloud Shadow |
5 |
Snow |
Snow |
6 |
Clear |
Clear |
7 |
Water |
Water |
8-9 |
Cloud Confidence |
Cloud Confidence |
10-11 |
Cloud Shadow Confidence |
Cloud Shadow Confidence |
12-13 |
Snow/Ice Confidence |
Snow/Ice Confidence |
14-15 |
Unused |
Cirrus Confidence |
The two following functions will be used to mask clouds, cloud shadows, … on everny images of an ImageCollection.
/**
* Utility to extract bitmask values.
* Look up the bit-ranges in the catalog.
*
* value - ee.Number or ee.Image to extract from.
* fromBit - int or ee.Number with the first bit.
* toBit - int or ee.Number with the last bit (inclusive).
* Defaults to fromBit.
*/
function bitwiseExtract(value, fromBit, toBit) {
if (toBit === undefined) toBit = fromBit
var maskSize = ee.Number(1).add(toBit).subtract(fromBit)
var mask = ee.Number(1).leftShift(maskSize).subtract(1)
return value.rightShift(fromBit).bitwiseAnd(mask)
}
var maskClouds = function(image) {
var QA = image.select('QA_PIXEL');
var clouds = bitwiseExtract(QA, 3).eq(0)
var cloud_shadows = bitwiseExtract(QA, 4).eq(0)
var mask = clouds
.and(cloud_shadows)
var maskedImage = image.updateMask(mask)
return maskedImage
}