Уведомления

Группа в Telegram: @pythonsu

#1 Март 30, 2012 08:08:58

Just_xD
Зарегистрирован: 2012-03-30
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше реализовать попиксельный перебор изображения?

Необходимо обойти попиксельно изображение и собрать данные о цвете (РЖБ) в матрицу значений (вложенные списки), додумался сделать только так! Как можно обойтись без 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)

Офлайн

#2 Март 30, 2012 08:25:20

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как лучше реализовать попиксельный перебор изображения?

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

а в чем смысл этих действий?
x = 0
y = 0
x += 1
y += 1
x = 0



Офлайн

#3 Март 30, 2012 08:32:45

Just_xD
Зарегистрирован: 2012-03-30
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше реализовать попиксельный перебор изображения?

FishHook
а в чем смысл этих действий?
x = 0
y = 0
x += 1
y += 1
x = 0

да…эт я лохонулся))) прост переработал с 1с)))там это норма))

Отредактировано Just_xD (Март 30, 2012 08:33:36)

Офлайн

#4 Март 30, 2012 18:41:25

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Как лучше реализовать попиксельный перебор изображения?

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]
В документации PIL.Image есть все эти функции.

Отредактировано reclosedev (Март 30, 2012 18:45:20)

Офлайн

#5 Апрель 1, 2012 02:14:37

Just_xD
Зарегистрирован: 2012-03-30
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше реализовать попиксельный перебор изображения?

reclosedev
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]
В документации PIL.Image есть все эти функции.

Спасибо огромное! Я побывал читать документацию, даже при неплохом уровне тех. английского, скудных примеров не хватает, думаю все придет с опытом

от списка списков пожалуй откажусь ибо как я понял не оч эффетивно для обработки, теперь возник новый вопрос, как оптимальней всего обрабатывать полученный список (производить математические операции с числами) и есть ли возможность получить стандартными или доп средствами конвертацию RGB => Lab (формулы знаю, функцию написал, но может есть более эффективные методы)

благодарствую еще раз за помощь)

Отредактировано Just_xD (Апрель 1, 2012 02:22:14)

Офлайн

#6 Апрель 1, 2012 20:36:23

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Как лучше реализовать попиксельный перебор изображения?

Если нужна серьезная обработка изображений, стоит посмотреть в сторону numpy, scipy и scikits-image

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version