El uso de GDAL/Python es otra manera de realizar este procedimiento. Para probarlo, he preparado una trama (aleatorio con valores de 0 y 1) y 29 de filas por 29 columnas. Este fue utilizado para la ejecución del siguiente código en la Consola de Python de QGIS (y esta trama como capa activa):
from osgeo import gdal
import struct
import numpy as np
layer = iface.activeLayer()
provider = layer.dataProvider()
fmttypes = {'Byte':'B', 'UInt16':'H', 'Int16':'h', 'UInt32':'I', 'Int32':'i', 'Float32':'f', 'Float64':'d'}
path= provider.dataSourceUri()
dataset = gdal.Open(path)
band = dataset.GetRasterBand(1)
BandType = gdal.GetDataTypeName(band.DataType)
array = []
for i in range(band.YSize - 2):
for j in range(band.XSize - 2):
scanline = band.ReadRaster(i, j, 3, 3, 3, 3, band.DataType)
values = struct.unpack(fmttypes[BandType] * 9, scanline)
tmp = np.sum(values) - values[4]
array.append(tmp)
dataset = None
El algoritmo empieza en la posición (x_off,y_off) = (0,0) y explora todas las células, teniendo en cuenta los bloques de 3x3. El elemento de valor[4] = valor[2][2] siempre es eliminado de cada suma. El barrio de análisis se guardan en la lista de la matriz y podría ser utilizado para la creación de una nueva trama. La serie completa aquí obtenidos (matriz) para esta trama se expone a continuación y se verificó que los valores esperados fueron producidos.
[6.0, 4.0, 3.0, 5.0, 4.0, 6.0, 3.0, 3.0, 4.0, 2.0, 3.0, 2.0, 3.0, 4.0, 6.0, 5.0, 5.0, 3.0, 3.0, 2.0, 3.0, 4.0, 2.0, 4.0, 1.0, 3.0, 3.0, 4.0, 4.0, 5.0, 5.0, 3.0, 5.0, 4.0, 3.0, 4.0, 2.0, 4.0, 1.0, 4.0, 3.0, 4.0, 4.0, 5.0, 4.0, 5.0, 4.0, 3.0, 4.0, 4.0, 4.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 5.0, 6.0, 5.0, 4.0, 4.0, 4.0, 3.0, 4.0, 3.0, 4.0, 4.0, 5.0, 5.0, 6.0, 5.0, 4.0, 2.0, 5.0, 4.0, 5.0, 4.0, 4.0, 2.0, 3.0, 3.0, 4.0, 6.0, 6.0, 5.0, 5.0, 5.0, 4.0, 3.0, 5.0, 4.0, 4.0, 3.0, 3.0, 5.0, 6.0, 5.0, 3.0, 3.0, 1.0, 4.0, 3.0, 6.0, 5.0, 4.0, 3.0, 4.0, 4.0, 4.0, 5.0, 6.0, 5.0, 6.0, 5.0, 7.0, 5.0, 4.0, 4.0, 4.0, 6.0, 5.0, 6.0, 6.0, 6.0, 6.0, 5.0, 4.0, 4.0, 4.0, 6.0, 6.0, 6.0, 5.0, 3.0, 3.0, 5.0, 3.0, 4.0, 1.0, 4.0, 3.0, 5.0, 3.0, 4.0, 4.0, 2.0, 5.0, 5.0, 8.0, 8.0, 6.0, 4.0, 3.0, 4.0, 3.0, 4.0, 4.0, 6.0, 5.0, 5.0, 5.0, 2.0, 4.0, 2.0, 3.0, 2.0, 5.0, 5.0, 7.0, 4.0, 4.0, 4.0, 4.0, 5.0, 4.0, 5.0, 5.0, 5.0, 6.0, 7.0, 7.0, 6.0, 6.0, 4.0, 6.0, 6.0, 7.0, 4.0, 5.0, 4.0, 1.0, 2.0, 3.0, 5.0, 6.0, 6.0, 6.0, 4.0, 4.0, 3.0, 4.0, 4.0, 5.0, 4.0, 4.0, 3.0, 5.0, 7.0, 7.0, 6.0, 5.0, 5.0, 3.0, 4.0, 5.0, 4.0, 4.0, 5.0, 5.0, 4.0, 5.0, 6.0, 5.0, 5.0, 4.0, 7.0, 5.0, 5.0, 2.0, 3.0, 2.0, 3.0, 5.0, 6.0, 7.0, 7.0, 6.0, 5.0, 5.0, 5.0, 5.0, 4.0, 6.0, 5.0, 5.0, 5.0, 4.0, 5.0, 4.0, 4.0, 5.0, 4.0, 3.0, 2.0, 3.0, 2.0, 2.0, 4.0, 3.0, 5.0, 4.0, 4.0, 5.0, 5.0, 6.0, 6.0, 5.0, 4.0, 6.0, 4.0, 5.0, 6.0, 7.0, 3.0, 3.0, 3.0, 5.0, 4.0, 5.0, 5.0, 4.0, 3.0, 2.0, 2.0, 3.0, 2.0, 4.0, 4.0, 3.0, 3.0, 4.0, 6.0, 7.0, 8.0, 6.0, 7.0, 3.0, 5.0, 4.0, 4.0, 4.0, 4.0, 2.0, 3.0, 4.0, 4.0, 3.0, 1.0, 2.0, 0.0, 1.0, 1.0, 2.0, 3.0, 2.0, 3.0, 3.0, 3.0, 5.0, 6.0, 7.0, 6.0, 6.0, 3.0, 4.0, 6.0, 5.0, 3.0, 2.0, 4.0, 4.0, 6.0, 5.0, 7.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0, 1.0, 2.0, 2.0, 2.0, 3.0, 2.0, 5.0, 5.0, 6.0, 6.0, 3.0, 2.0, 3.0, 3.0, 5.0, 5.0, 4.0, 2.0, 5.0, 4.0, 5.0, 3.0, 3.0, 3.0, 1.0, 1.0, 0.0, 1.0, 2.0, 4.0, 3.0, 3.0, 2.0, 5.0, 4.0, 5.0, 3.0, 3.0, 4.0, 6.0, 6.0, 4.0, 4.0, 3.0, 5.0, 4.0, 5.0, 7.0, 6.0, 6.0, 3.0, 3.0, 2.0, 1.0, 1.0, 1.0, 4.0, 2.0, 2.0, 1.0, 3.0, 3.0, 4.0, 3.0, 5.0, 4.0, 5.0, 5.0, 5.0, 6.0, 3.0, 4.0, 2.0, 4.0, 4.0, 4.0, 4.0, 3.0, 4.0, 2.0, 2.0, 1.0, 3.0, 5.0, 5.0, 5.0, 3.0, 4.0, 3.0, 3.0, 3.0, 3.0, 5.0, 7.0, 6.0, 5.0, 3.0, 4.0, 5.0, 3.0, 3.0, 3.0, 4.0, 4.0, 3.0, 3.0, 3.0, 3.0, 1.0, 4.0, 5.0, 6.0, 5.0, 4.0, 5.0, 5.0, 3.0, 3.0, 5.0, 5.0, 4.0, 3.0, 3.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 2.0, 1.0, 3.0, 4.0, 4.0, 3.0, 3.0, 4.0, 5.0, 7.0, 6.0, 7.0, 6.0, 5.0, 3.0, 3.0, 3.0, 5.0, 4.0, 3.0, 1.0, 1.0, 3.0, 5.0, 4.0, 3.0, 1.0, 3.0, 2.0, 4.0, 3.0, 6.0, 3.0, 4.0, 4.0, 4.0, 6.0, 4.0, 7.0, 7.0, 7.0, 6.0, 4.0, 5.0, 5.0, 3.0, 3.0, 2.0, 3.0, 4.0, 3.0, 2.0, 3.0, 1.0, 4.0, 2.0, 6.0, 4.0, 5.0, 2.0, 3.0, 3.0, 3.0, 5.0, 3.0, 5.0, 5.0, 6.0, 5.0, 3.0, 6.0, 5.0, 4.0, 5.0, 3.0, 3.0, 4.0, 5.0, 5.0, 4.0, 2.0, 5.0, 4.0, 6.0, 5.0, 6.0, 3.0, 3.0, 3.0, 5.0, 5.0, 5.0, 4.0, 5.0, 6.0, 7.0, 5.0, 5.0, 4.0, 4.0, 3.0, 4.0, 6.0, 7.0, 6.0, 4.0, 4.0, 4.0, 5.0, 7.0, 6.0, 4.0, 4.0, 2.0, 4.0, 3.0, 4.0, 4.0, 3.0, 1.0, 4.0, 4.0, 5.0, 2.0, 6.0, 3.0, 3.0, 3.0, 3.0, 2.0, 3.0, 5.0, 4.0, 5.0, 3.0, 4.0, 5.0, 4.0, 5.0, 4.0, 4.0, 4.0, 6.0, 4.0, 6.0, 4.0, 4.0, 5.0, 4.0, 6.0, 4.0, 3.0, 4.0, 3.0, 4.0, 3.0, 4.0, 4.0, 5.0, 3.0, 5.0, 3.0, 5.0, 6.0, 4.0, 4.0, 2.0, 6.0, 4.0, 5.0, 1.0, 4.0, 2.0, 4.0, 4.0, 3.0, 5.0, 3.0, 2.0, 3.0, 3.0, 4.0, 3.0, 4.0, 3.0, 5.0, 5.0, 5.0, 4.0, 3.0, 2.0, 2.0, 4.0, 3.0, 5.0, 4.0, 6.0, 4.0, 6.0, 4.0, 4.0, 5.0, 4.0, 6.0, 5.0, 2.0, 3.0, 5.0, 4.0, 6.0, 4.0, 5.0, 5.0, 5.0, 4.0, 2.0, 3.0, 4.0, 5.0, 5.0, 4.0, 6.0, 5.0, 4.0, 3.0, 3.0, 4.0, 5.0, 6.0, 5.0, 6.0, 6.0, 2.0, 1.0, 3.0, 1.0, 4.0, 3.0, 6.0, 6.0, 5.0, 6.0, 3.0, 4.0, 3.0, 4.0, 4.0, 3.0, 3.0, 4.0, 4.0, 6.0, 6.0, 5.0, 3.0, 4.0, 6.0, 6.0, 5.0]
Una nueva evaluación, con una ligera modificación del código anterior, podría ser ejecutado con 5x5 bloques de si el requisito de suma >= 5 no es llevada a cabo por bloques de 3x3 .