Разделение бинарного изображения на «блоки» пиксельных данных

Я использую Python и PIL как часть своей работы по встраиванию данных в бинарные изображения, и мне нужно проанализировать группы пикселей, чтобы определить соответствующие пиксели, которыми нужно манипулировать для встраивания данных. Изображение нужно разделить на равные «блоки» пиксельных данных, готовых к анализу, но я изо всех сил пытаюсь придумать подходящий метод для этого. Я пробовал методы с использованием массивов Python и numPy, но безуспешно. Любые предложения будут ценны.

Спасибо


person BootStrap    schedule 19.04.2011    source источник
comment
У вас есть изображения RGB или оттенки серого/чб?   -  person Anatolij    schedule 19.04.2011
comment
Изображения являются двоичными, поскольку черные пиксели равны «0», белые пиксели равны «1», я полагаю, это тип оттенков серого.   -  person BootStrap    schedule 19.04.2011
comment
Ага, то же самое. Извините, мой комментарий был немного нечетким.   -  person Skurmedel    schedule 19.04.2011


Ответы (2)


Вам нужно использовать numpy array нарезку, чтобы получить группу пикселей. Изображение — это всего лишь 2D-массив, поэтому вы можете использовать arr = numpy.array(Image.open(filename)), а затем разрезать его.

#this code block from my fractal dimension finder
step = 2**a
for j in range(2**l):
    for i in range(2**l):
        block = arr[j * step:(j + 1) * step, i * step:(i + 1) * step]
person Anatolij    schedule 19.04.2011

Вы можете использовать малоизвестные трюки с шагом, чтобы создать представление вашего изображения, состоящее из блоков. Это очень быстро и не требует дополнительной памяти (пример немного многословен):

import numpy as np

#img = np.array(Image.open(filename), dtype='uint8')

w, h = 5, 4 # width, height of image
bw, bh = 2, 3 # width, height of blocks

img = np.random.randint(2, size=(h, w)) # create a random binary image

# build a blocky view of the image data
sz = img.itemsize # size in bytes of the elements in img
shape = (h-bh+1, w-bw+1, bh, bw) # the shape of the new array: two indices for the blocks,
                                 # two indices for the content of each block
strides = (w*sz, sz, w*sz, sz) # information about how to map indices to image data
blocks = np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)

# now we can access the blocks
print img
[[1 1 0 0 0]
 [0 1 1 0 0]
 [0 0 1 0 1]
 [1 0 1 0 0]]

print blocks[0,0]
[[1 1]
 [0 1]
 [0 0]]

print blocks[1,2]
[[1 0]
 [1 0]
 [1 0]]
person pberkes    schedule 20.04.2011
comment
Как сделать, чтобы блоки не пересекались? - person Cerin; 09.11.2011