PixelBlockCollection

Сводка

Задает доступ только для чтения для всех блоков пикселов из одного растра или списка растров.

Описание

Объект 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):

Набор группы пикселов с шагом (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Блоки пикселов будут покрывать только область пересечения растров.
  • UNIONБлоки пикселов будут покрывать экстент всех растров.

(Значение по умолчанию — INTERSECTION)

String
nodata_to_values
[nodata_to_values,...]

Значение для присвоения значений NoData входных растров в полученный массив NumPy. Это может быть одно значение или список значений - одно для каждого растра.

Integer

Свойства

ВладениеОбъяснениеТип данных
size
(только чтение)

Число блоков пикселов по направлениям y и x в наборе блоков пикселов. Число блоков пикселов по направлению y идет первым.

tuple

Обзор метода

МетодОбъяснение
reset ()

Сбрасывает итератор коллекции блоков пикселов в начало коллекции.

shuffle ()

Перемешивает блоки пикселов в коллекции блоков пикселов. Это полезно при передаче образцов изображений в модель глубокого обучения.

Методы

reset ()
Значение отраженного сигнала
Тип данныхОбъяснение
PixelBlockCollection

Объект PixelBlockCollection, который был сброшен.

shuffle ()
Значение отраженного сигнала
Тип данныхОбъяснение
PixelBlockCollection

Объект PixelBlockCollection с перемешанными блоками пикселов.

Пример кода

Пример PixelBlockCollection 1 (окно Python)

Итерационно проходит через блоки пикселов для вычисления общей площади застройки в растре ландшафта.

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))
Пример PixelBlockCollection 2 (автономный скрипт)

Итерационно проходит через блоки пикселов для вычисления общей площади уменьшения лесов в пользу застройки с 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))