卷積
想要對圖像執(zhí)行線性卷積操作颊亮,使用image.convolve()
函數(shù)阀捅。該函數(shù)只有一個參數(shù),稱之為ee.Kernel
熏瞄,它由形狀和kernel中的權(quán)重共同決定脚祟,輸出的圖像中每個像素值都由內(nèi)核值和輸入圖像像素值的線性組合共同確定。內(nèi)核分別應(yīng)用在每個波段强饮,例如由桌,當(dāng)需要使用平滑內(nèi)核過濾掉高頻信息,可做如下操作:
// Load and display an image.
var image = ee.Image('LANDSAT/LC08/C01/T1_TOA/LC08_044034_20140318');
Map.setCenter(-121.9785, 37.8694, 11);
Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'input image');
// Define a boxcar or low-pass kernel.
var boxcar = ee.Kernel.square({
radius: 7, units: 'pixels', normalize: true
});
// Smooth the image by convolving with the boxcar kernel.
var smooth = image.convolve(boxcar);
Map.addLayer(smooth, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'smoothed');
使用低通的濾波器進(jìn)行卷積胡陪,輸出圖如Fig.1所示沥寥。觀察內(nèi)核的參數(shù)明確其尺寸和系數(shù)碍舍。一般的柠座,將units
設(shè)置為像素,radius
指定為內(nèi)核覆蓋的中心的像素數(shù)片橡。如果normalize
設(shè)置為true妈经,則內(nèi)核系數(shù)之和為1,如果對幅度進(jìn)行了設(shè)置捧书,則內(nèi)核系數(shù)將乘上這個值吹泡。如果內(nèi)核系數(shù)中存在負(fù)值,則可以將normalize
設(shè)置為true经瓷,總和為零爆哑。
使用其它內(nèi)核來實(shí)現(xiàn)所需要的處理效果,這一例子使用拉普拉斯算子內(nèi)核進(jìn)行邊界檢測:
// Define a Laplacian, or edge-detection kernel.
var laplacian = ee.Kernel.laplacian8({ normalize: false });
// Apply the edge-detection kernel.
var edgy = image.convolve(laplacian);
Map.addLayer(edgy,
{bands: ['B5', 'B4', 'B3'], max: 0.5, format: 'png'},
'edges');
請注意可視化參數(shù)的格式說明符舆吮,為了提高運(yùn)行效率揭朝,GEE將會以JPEG格式將圖層傳遞到代碼編輯器中,但邊界則使用PNG格式色冀,用以處理圖像邊界像素的透明度潭袱。當(dāng)看起來不夠連續(xù)時,格式設(shè)置為PNG會一致顯示锋恬。使用拉普拉斯進(jìn)行邊界檢測屯换,結(jié)果如下圖:
還有其他邊緣檢測的內(nèi)核,例如Sobel与学、Prewitt彤悔、Roberts等等嘉抓,可以通過
kernel.rotate()
進(jìn)行改變,其他的低通內(nèi)核還包括高斯核核具有均勻權(quán)重的各種尺寸和形狀的內(nèi)核晕窑,想要創(chuàng)建具有任意定義權(quán)重和形狀的內(nèi)核掌眠,使用ee.Kernel.fixed ()
函數(shù)進(jìn)行設(shè)置。下面的例子設(shè)置了一個9*9的內(nèi)核:
// Create a list of weights for a 9x9 kernel.
var list = [1, 1, 1, 1, 1, 1, 1, 1, 1];
// The center of the kernel is zero.
var centerList = [1, 1, 1, 1, 0, 1, 1, 1, 1];
// Assemble a list of lists: the 9x9 kernel weights as a 2-D matrix.
var lists = [list, list, list, list, centerList, list, list, list, list];
// Create the kernel from the weights.
var kernel = ee.Kernel.fixed(9, 9, lists, -4, -4, false);
print(kernel);