Membagi gambar biner menjadi 'blok' data piksel

Saya menggunakan Python dan PIL sebagai bagian dari pekerjaan saya dalam menyematkan data dalam gambar biner dan perlu menganalisis kelompok piksel untuk menentukan piksel yang tepat untuk dimanipulasi guna menyematkan data. Gambar perlu dipecah menjadi 'blok' data piksel yang sama dan siap untuk dianalisis, tetapi saya kesulitan menemukan metode yang tepat untuk melakukan ini. Saya telah mencoba teknik menggunakan array Python dan numPy, tetapi tidak berhasil. Setiap saran akan sangat dihargai.

Terima kasih


person BootStrap    schedule 19.04.2011    source sumber
comment
Anda memiliki gambar RGB atau skala abu-abu/bw?   -  person Anatolij    schedule 19.04.2011
comment
Gambarnya biner - seperti dalam piksel hitam adalah '0' piksel putih adalah '1', menurut saya sejenis skala abu-abu.   -  person BootStrap    schedule 19.04.2011
comment
Ya, hal yang sama. Maaf, komentar saya agak kabur.   -  person Skurmedel    schedule 19.04.2011


Jawaban (2)


Anda perlu menggunakan numpy array slicing untuk mendapatkan sekelompok piksel. Gambar hanyalah array 2D, jadi Anda dapat menggunakan arr = numpy.array(Image.open(filename)), dan setelah itu Anda dapat mengirisnya.

#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

Anda dapat menggunakan trik langkah yang jarang diketahui untuk membuat tampilan gambar Anda yang terbuat dari balok. Ini sangat cepat dan tidak memerlukan memori tambahan (contohnya agak bertele-tele):

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
Bagaimana caranya agar balok-balok tersebut tidak tumpang tindih? - person Cerin; 09.11.2011