Форум сайта python.su
0
Необходимо обойти попиксельно изображение и собрать данные о цвете (РЖБ) в матрицу значений (вложенные списки), додумался сделать только так! Как можно обойтись без 2х вложенных циклов?? Да и вообще оптимизировать этот процесс или есть вообще другие способы решения задачи
im = Image.open("test.png") x_dimension = im.size[0] y_dimension = im.size[1] matrix = [] str_matrix = [] for y in range(y_dimension) : for x in range(x_dimension) : str_matrix.append(im.getpixel((x,y))) matrix.append(str_matrix) str_matrix = []
Отредактировано Just_xD (Март 30, 2012 08:33:08)
Офлайн
568
Just_xD
Необходимо обойти попиксельно изображение и собрать данные о цвете (РЖБ) в матрицу значений (вложенные списки), додумался сделать только так! Как можно обойтись без 2х вложенных циклов?? Да и вообще оптимизировать этот процесс или есть вообще другие способы решения задачиim = Image.open("test.png") x_dimension = im.size[0] y_dimension = im.size[1] x = 0 y = 0 matrix = [] str_matrix = [] for y in range(y_dimension) : for x in range(x_dimension) : str_matrix.append(im.getpixel((x,y))) x += 1 matrix.append(str_matrix) str_matrix = [] y += 1 x = 0
Офлайн
0
FishHook
а в чем смысл этих действий?
x = 0
y = 0
x += 1
y += 1
x = 0
Отредактировано Just_xD (Март 30, 2012 08:33:36)
Офлайн
173
Just_xDДа, getpixel во вложенном цикле - очень неэффективен. Мой ответ в коде с коментариями
Да и вообще оптимизировать этот процесс или есть вообще другие способы решения задачи
#!/usr/bin/env python # -*- coding: utf-8 -*- import Image img = Image.open('test.png') pixels = img.getdata() # print list(pixels) # Выдаст плоский список пикселей RGBA # [(220, 77, 0, 24), (219, 77, 0, 201), (217, 76, 0, 225), ...] # если не нужен Alpha канал можно сконвертировать в RGB rgbimg = img.convert('RGB') # если зачем-то нужен список списков, можно сделать так: w, h = img.size print w, h pixels = list(rgbimg.getdata()) matrix = [pixels[i:i + w] for i in xrange(0, w * h, w)] # также есть метод Image.load(), который начиная с версии 1.1.6 возвращает # объект с помощью которого можно читать и писать пиксели rwpixels = rgbimg.load() print rwpixels[0, 0] # и писать # rwpixels[0, 0] = (123, 123, 123) # для проверки for x in xrange(w): for y in xrange(h): assert matrix[y][x] == rwpixels[x, y]
Отредактировано reclosedev (Март 30, 2012 18:45:20)
Офлайн
0
reclosedevJust_xDДа, getpixel во вложенном цикле - очень неэффективен. Мой ответ в коде с коментариями
Да и вообще оптимизировать этот процесс или есть вообще другие способы решения задачиВ документации PIL.Image есть все эти функции.#!/usr/bin/env python # -*- coding: utf-8 -*- import Image img = Image.open('test.png') pixels = img.getdata() # print list(pixels) # Выдаст плоский список пикселей RGBA # [(220, 77, 0, 24), (219, 77, 0, 201), (217, 76, 0, 225), ...] # если не нужен Alpha канал можно сконвертировать в RGB rgbimg = img.convert('RGB') # если зачем-то нужен список списков, можно сделать так: w, h = img.size print w, h pixels = list(rgbimg.getdata()) matrix = [pixels[i:i + w] for i in xrange(0, w * h, w)] # также есть метод Image.load(), который начиная с версии 1.1.6 возвращает # объект с помощью которого можно читать и писать пиксели rwpixels = rgbimg.load() print rwpixels[0, 0] # и писать # rwpixels[0, 0] = (123, 123, 123) # для проверки for x in xrange(w): for y in xrange(h): assert matrix[y][x] == rwpixels[x, y]

Отредактировано Just_xD (Апрель 1, 2012 02:22:14)
Офлайн
173
Если нужна серьезная обработка изображений, стоит посмотреть в сторону numpy, scipy и scikits-image
Офлайн