Сводка
Задает доступ только для чтения для всех блоков пикселов из одного растра или списка растров.
Описание
Объект PixelBlockCollection является итератором для всех объектов PixelBlock в растре или списке растров. Его можно использовать для выполнения пользовательской растровой обработки поблочно, когда в противном случае обработанные растры будут слишком большими для загрузки в память.
Класс PixelBlockCollection поддерживает одиночный растр или список растров в качестве входных данных. Если на вход подается одиночный растр, то в результате будет только два измерения (количество блоков пикселов по y, количество блоков пикселов по x). Например, для доступа к первому блоку пикселов во входном растре, используйте следующее:
pixelblockcoll = PixelBlockCollection(in_raster)
numpy_array = pixelblockcoll[0][0].getData()
Если на вход подается список растров, то в результате будет три измерения (количество блоков пикселов по y, количество блоков пикселов по x, количество входных растров). Например, для доступа к первому блоку пикселов из второго растра в списке, используйте следующее:
pixelblockcoll = PixelBlockCollection(in_raster1, in_raster2) numpy_array = pixelblockcoll[0][0][1].getData()
Аргумент stride класса PixelBlockCollection определяет число битов от одной строки пикселов в памяти до другой строки пикселов в памяти. Это также называется приращением, размером шага или интервалом. На рисунке ниже показано, как объект PixelBlockCollection итерационно проходит через пикселы, когда задан шаг по умолчанию, который соответствует размеру блока пикселов:
На рисунке ниже показано, как объект PixelBlockCollection итерационно проходит через пикселы, если задан шаг (2, 1):
Синтаксис
PixelBlockCollection (in_rasters, pixel_block_size, stride, overlay_type, nodata_to_values)
Parameter | Объяснение | Тип данных |
in_rasters [in_rasters,...] | Входной растровых объект или список растровых объектов. Если вы используете список растровых объектов, все растры должны иметь одинаковые размер ячейки и пространственную привязку. | Raster |
pixel_block_size | Кортеж с двумя значениями, описывающими размер блока (число строк, число столбцов). (Значение по умолчанию — (512, 512)) | tuple |
stride | Кортеж с двумя целыми числами, задающими шаг или приращение по строкам и столбцам для обработки. Если значение не указано, будет использоваться размер блока пикселов, и смежные блоки пикселов не будут перекрываться. (Значение по умолчанию — None) | tuple |
overlay_type | Определяет тип перекрытия, если у входных растров разные экстенты.
(Значение по умолчанию — INTERSECTION) | String |
nodata_to_values [nodata_to_values,...] | Значение для присвоения значений NoData входных растров в полученный массив NumPy. Это может быть одно значение или список значений - одно для каждого растра. | Integer |
Свойства
Владение | Объяснение | Тип данных |
size (только чтение) | Число блоков пикселов по направлениям y и x в наборе блоков пикселов. Число блоков пикселов по направлению y идет первым. | tuple |
Обзор метода
Метод | Объяснение |
reset () | Сбрасывает итератор коллекции блоков пикселов в начало коллекции. |
shuffle () | Перемешивает блоки пикселов в коллекции блоков пикселов. Это полезно при передаче образцов изображений в модель глубокого обучения. |
Методы
reset ()
Тип данных | Объяснение |
PixelBlockCollection | Объект PixelBlockCollection, который был сброшен. |
shuffle ()
Тип данных | Объяснение |
PixelBlockCollection | Объект PixelBlockCollection с перемешанными блоками пикселов. |
Пример кода
Итерационно проходит через блоки пикселов для вычисления общей площади застройки в растре ландшафта.
import arcpy
# Specify the input raster
in_raster1 = arcpy.Raster("landcover.tif")
# Create a PixelBlockCollection
blockCollection = arcpy.ia.PixelBlockCollection(
in_raster1, pixel_block_size = (512, 512), nodata_to_values = -1)
# Check the number of pixelblocks along x and y direction
number_blocks_y, number_blocks_x= pixelblocks.size
urban_cell_count=0
# Iterate through each PixelBlock
for i in range(number_blocks_y):
for j in range(number_blocks_x):
pixelblock = blockCollection[i][j]
np_array = pixelblock.getData()
urban_cell_count+= np.count_nonzero(np_array == 3)
# value = 3 is urban class
urban_area = urban_cell_count * in_raster1.meanCellWidth*in_raster1.meanCellHeight
print("Total urban area : " + str(urban_area))
Итерационно проходит через блоки пикселов для вычисления общей площади уменьшения лесов в пользу застройки с 2006 по 2016 годы.
import arcpy
from arcpy.ia import *
# Specify the input rasters
in_raster1 = arcpy.Raster("C:/iapyexamples/data/landcover_2006.tif")
in_raster2 = arcpy.Raster("C:/iapyexamples/data/landcover_2016.tif")
# Create a PixelBlockCollection
blockCollection = arcpy.ia.PixelBlockCollection(
[in_raster1, in_raster2], pixel_block_size = (256, 256), nodata_to_values = -1)
# Check the number of pixelblocks along x and y direction
number_blocks_y, number_blocks_x= pixelblocks.size
forest_to_urban_cell_count = 0
# Iterate through each PixelBlock
for i in range(number_blocks_y):
for j in range(number_blocks_x):
pixelblocklist = blockCollection[i][j]
# get the array from pixelblock in the 1st raster
array_in_raster1 = pixelblocklist[0].getData()
# get the array from pixelblock in the 2nd raster
array_ in_raster2 = pixelblocklist[1].getData()
forest_in_raster1= array_in_raster1[array_in_raster1==1] # value = 1 is forest class
urban_in_raster2= array_in_raster2[array_in_raster2==3] # value = 3 is urban class
res= forest_in_raster1+ urban_in_raster2
forest_to_urban_cell_count+= np.count_nonzero(res == 4) # value = 4 is forest in in_raster1 and urban in in_raster2
forest_to_urban_area= forest_to_urban_cell_count * in_raster1.meanCellWidth*in_raster1.meanCellHeight
print("total area from forest in 2006 to urban in 2016 : " + str(forest_to_urban_area))