将二进制图像划分为像素数据的“块”

时间:2011-04-19 12:35:53

标签: python numpy embedding python-imaging-library

我正在使用Python和PIL作为我在二进制图像中嵌入数据的工作的一部分,并且需要分析像素组以确定要操作的适当像素以嵌入数据。图像需要分成相同的“块”像素数据,以备分析,但我很难想出一个合适的方法来做到这一点。我尝试过使用Python和numPy数组的技术,但没有成功。任何建议将不胜感激。

由于

2 个答案:

答案 0 :(得分:3)

您需要使用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]

答案 1 :(得分:3)

您可以使用鲜为人知的步幅技巧来创建由块构建的图像的视图。它非常快,不需要任何额外的内存(例子有点冗长):

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]]