Чтение изображений и аппроксимация и воссоздание каждого пикселя с ближайшими цветами? - PullRequest
0 голосов
/ 28 апреля 2011

http://pastebin.com/v0B3Vje2 Я ищу способ получить пиксели из изображения, а затем найти ближайший цвет к этому в другой программе (я могу скомпилировать его в исходный код "Другой программы"; идеально, если он совместим без внедрения источника), а затем использовать это цвет и поместите его в правильный пиксель. По сути, Script / Code / Executable берет, например, файл изображения, а затем заново создает каждый пиксель с наиболее близкими совпадениями. Программа, о которой я говорю, - «Пороховая игрушка». (Powdertoy.co.uk). Если вы это знаете, я использую его в личных целях и для проверки концепции, поскольку у «общественных сейфов» не может быть CGI. JoJoBond, один из пользователей, которому разрешено делать это, как он / она сделал это первым.

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Возможно, используйте scipy.cluster.vq.vq для квантования изображения:

import numpy as np
import scipy.cluster.vq as vq
import Image
import random

img = Image.open('cartoon.png').convert('RGB')
arr = np.asarray(img)
shape_orig = arr.shape

# make arr a 2D array
arr = arr.reshape(-1,3)

# create an array of all the colors in the image
palette=np.unique(arr.ravel().view([('r',np.uint8),('g',np.uint8),('b',np.uint8)]))
# randomly select 50 colors from the palette
palette=palette[random.sample(range(len(palette)),50)]

# make palette a 2D array
palette=palette.view('uint8').reshape(-1,3)

# Quantize arr to the closet color in palette
code,dist=vq.vq(arr,palette)
arr_quantized=palette[code]

# make arr_quantized have the same shape as arr
arr_quantized=arr_quantized.reshape(shape_orig)
img_new=Image.fromarray(arr_quantized)
img_new.save('/tmp/cartoon_quantized.png')

с cartoon.png:

enter image description here

приведенный выше код создает cartoon_quantized.png:

enter image description here

Примечание: я не очень разбираюсь в том, как лучше определить близкие цвета.

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

Возможно, вы захотите выбрать другую цветовую систему, чем RGB, и, возможно, даже другую метрику, чем евклидово расстояние. К сожалению, я не уверен, возможно ли использовать vq.vq, если вам нужна метрика, отличная от евклидова расстояния ...

1 голос
/ 28 апреля 2011

Вы можете использовать Python Imaging Library для загрузки изображения и извлечения значений цвета пикселей:

import Image

img = Image.open('random.png')
width, height = img.size
pixels = img.getdata()
print 'pixels:'
for i, px in enumerate(img.getdata()):

    # decide whether to replace this pixel

    # call out to external program to translate color value
    r, g, b = px
    npx = (b, g, r)

    # replace pixel with new color value        
    y = i / width
    x = i % width
    img.putpixel((x, y), npx)

    print px, npx

Вывод:

pixels:
(58, 0, 0) (0, 0, 58)
(0, 0, 0) (0, 0, 0)
(0, 0, 4) (4, 0, 0)
(0, 0, 0) (0, 0, 0)
(0, 0, 0) (0, 0, 0)
(0, 245, 0) (0, 245, 0)
(0, 0, 0) (0, 0, 0)
(0, 0, 0) (0, 0, 0)
(14, 0, 0) (0, 0, 14)
...
...