Найти - Пользователи
Полная версия: Как лучше реализовать попиксельный перебор изображения?
Начало » Python для новичков » Как лучше реализовать попиксельный перебор изображения?
1
Just_xD
Необходимо обойти попиксельно изображение и собрать данные о цвете (РЖБ) в матрицу значений (вложенные списки), додумался сделать только так! Как можно обойтись без 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 = []
FishHook
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
Just_xD
FishHook
а в чем смысл этих действий?
x = 0
y = 0
x += 1
y += 1
x = 0

да…эт я лохонулся))) прост переработал с 1с)))там это норма))
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 есть все эти функции.
Just_xD
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 (формулы знаю, функцию написал, но может есть более эффективные методы)

благодарствую еще раз за помощь)
reclosedev
Если нужна серьезная обработка изображений, стоит посмотреть в сторону numpy, scipy и scikits-image
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB