Преобразование плоской последовательности в двумерную последовательность в Python - PullRequest
3 голосов
/ 11 октября 2010

У меня есть кусок кода, который будет возвращать плоскую последовательность для каждого пикселя в изображении.

import Image
im = Image.open("test.png")
print("Picture size is ", width, height)
data = list(im.getdata())
for n in range(width*height):
    if data[n] == (0, 0, 0):
        print(data[n], n)

Этот код возвращает что-то вроде этого

((0, 0, 0), 1250)
((0, 0, 0), 1251)
((0, 0, 0), 1252)
((0, 0, 0), 1253)
((0, 0, 0), 1254)
((0, 0, 0), 1255)
((0, 0, 0), 1256)
((0, 0, 0), 1257)

Первые три значенияRGB пикселя, а последний - индекс в последовательности.Зная ширину и высоту изображения и индекс пикселей по порядку, как я могу преобразовать эту последовательность обратно в двумерную последовательность?

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Простая математика: у вас есть n, ширина, высота и хотите x, y

x, y = n % width, n / width

или (делает то же самое, но более эффективно)

y, x = divmod(n, width)
0 голосов
/ 11 октября 2010

Вы можете легко создать функцию, которая будет эмулировать двумерные данные:

def data2d(x,y,width):
  return data[y*width+x]

Но если вы хотите поместить данные в двухуровневую структуру данных, вы можете сделать что-то вроде этого:

data2d = []
for n in range(height):
  datatmp = []
  for m in rante(width):
    datatmp.append(data[n*width+m])
  data2d[n] = datatmp

Возможно, вам придется сделать глубокую копию в этой последней строке. Это сделает data2d списком списков, чтобы вы могли получить доступ к пикселю в строке, столбце как data[row][column].

...