卷积
想要对图像执行线性卷积操作,使用image.convolve()
函数。该函数只有一个参数,称之为ee.Kernel
,它由形状和kernel中的权重共同决定,输出的图像中每个像素值都由内核值和输入图像像素值的线性组合共同确定。内核分别应用在每个波段,例如,当需要使用平滑内核过滤掉高频信息,可做如下操作:
// 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');
使用低通的滤波器进行卷积,输出图如Fig.1所示。观察内核的参数明确其尺寸和系数。一般的,将units
设置为像素,radius
指定为内核覆盖的中心的像素数。如果normalize
设置为true,则内核系数之和为1,如果对幅度进行了设置,则内核系数将乘上这个值。如果内核系数中存在负值,则可以将normalize
设置为true,总和为零。
![](https://img.haomeiwen.com/i12266405/8be6425ef6b16a43.png)
使用其它内核来实现所需要的处理效果,这一例子使用拉普拉斯算子内核进行边界检测:
// 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');
请注意可视化参数的格式说明符,为了提高运行效率,GEE将会以JPEG格式将图层传递到代码编辑器中,但边界则使用PNG格式,用以处理图像边界像素的透明度。当看起来不够连续时,格式设置为PNG会一致显示。使用拉普拉斯进行边界检测,结果如下图:
![](https://img.haomeiwen.com/i12266405/9543942560063801.png)
还有其他边缘检测的内核,例如Sobel、Prewitt、Roberts等等,可以通过
kernel.rotate()
进行改变,其他的低通内核还包括高斯核核具有均匀权重的各种尺寸和形状的内核,想要创建具有任意定义权重和形状的内核,使用ee.Kernel.fixed ()
函数进行设置。下面的例子设置了一个9*9的内核:
// 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);
网友评论