Skip to main content

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)

Имя Объяснение Тип данных

in_rasters

Входной растровых объект или список растровых объектов. Если вы используете список растровых объектов, все растры должны иметь одинаковые размер ячейки и пространственную привязку.

Raster

pixel_block_size

Кортеж с двумя значениями, описывающими размер блока (число строк, число столбцов).

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

tuple

stride

Кортеж с двумя целыми числами, задающими шаг или приращение по строкам и столбцам для обработки.

Если значение не указано, будет использоваться размер блока пикселов, и смежные блоки пикселов не будут перекрываться.

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

tuple

overlay_type

Определяет тип перекрытия, если у входных растров разные экстенты.

  • INTERSECTION—Блоки пикселов будут покрывать только область пересечения растров.

  • UNION—Блоки пикселов будут покрывать экстент всех растров.

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

String

nodata_to_values

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

Integer

Свойства

Имя Объяснение Тип данных

size

(Только для чтения)

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

tuple

Методы

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= blockCollection.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))