读取图像并用最接近的颜色近似和重新创建每个像素?

时间:2011-04-28 13:06:57

标签: c++ python cgi pixels approximation

http://pastebin.com/v0B3Vje2 我正在寻找一种从图像中获取像素的方法,然后找到与另一个程序中最接近的颜色(我可以将其编译成“另一个程序”的源代码;如果没有源代码注入则是完美的)然后使用它颜色并将其放到正确的像素。基本上,Script / Code / Executable以图像文件为例,然后用最接近的匹配重新创建每个像素。我正在谈论的节目是The Powder Toy。 (powdertoy.co.uk)。如果您知道,我将其用于私人目的和概念验证,因为“公共保存”不能包含CGI。 JoJoBond,其中一位用户,被允许这样做,因为他/她先做了。

2 个答案:

答案 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:

enter image description here

以上代码生成cartoon_quantized.png:

enter image description here

注意:我不熟悉定义近色的最佳方法是什么。

上面的代码使用vq.vq选择调色板中与给定图像中的颜色具有最小欧氏距离的颜色。 我不确定 - 事实上我怀疑 - 使用带有RGB元组的欧几里德距离是定义近色的最好方法。

您可能希望选择与RGB不同的颜色系统,甚至可能选择与欧几里德距离不同的度量标准。不幸的是,如果您需要与欧几里德距离不同的指标,我不确定是否可以使用vq.vq ...