http://pastebin.com/v0B3Vje2 我正在寻找一种从图像中获取像素的方法,然后找到与另一个程序中最接近的颜色(我可以将其编译成“另一个程序”的源代码;如果没有源代码注入则是完美的)然后使用它颜色并将其放到正确的像素。基本上,Script / Code / Executable以图像文件为例,然后用最接近的匹配重新创建每个像素。我正在谈论的节目是The Powder Toy。 (powdertoy.co.uk)。如果您知道,我将其用于私人目的和概念验证,因为“公共保存”不能包含CGI。 JoJoBond,其中一位用户,被允许这样做,因为他/她先做了。
答案 0 :(得分:1)
您可以使用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)
...
答案 1 :(得分:1)
也许使用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')
with cartoon.png:
以上代码生成cartoon_quantized.png:
注意:我不熟悉定义近色的最佳方法是什么。
上面的代码使用vq.vq
选择调色板中与给定图像中的颜色具有最小欧氏距离的颜色。
我不确定 - 事实上我怀疑 - 使用带有RGB元组的欧几里德距离是定义近色的最好方法。
您可能希望选择与RGB不同的颜色系统,甚至可能选择与欧几里德距离不同的度量标准。不幸的是,如果您需要与欧几里德距离不同的指标,我不确定是否可以使用vq.vq
...