Image processing 将图像的像素从给定的一组颜色更改为最接近的颜色

Image processing 将图像的像素从给定的一组颜色更改为最接近的颜色,image-processing,Image Processing,我没有任何编码经验,考虑到我的知识,我正在承担一个可能有点雄心勃勃的项目,所以我需要一些帮助 我正在尝试将地球上两幅图像的像素从16种不同颜色的托盘转换成最接近的颜色。图像为160x160像素。我的目标是拍摄这些图像,并将它们转换为相同的160x160图像,但仅包含所选颜色的像素 我有十六进制格式的16种颜色的值 -黑色:1D1D21 -红色:B02E26 -绿色:5E7C16 -布朗:835432 -蓝色:3C44AA -紫色:8932B8 -青色:169C9C -浅灰色:9D9D97 -灰色

我没有任何编码经验,考虑到我的知识,我正在承担一个可能有点雄心勃勃的项目,所以我需要一些帮助

我正在尝试将地球上两幅图像的像素从16种不同颜色的托盘转换成最接近的颜色。图像为160x160像素。我的目标是拍摄这些图像,并将它们转换为相同的160x160图像,但仅包含所选颜色的像素

我有十六进制格式的16种颜色的值 -黑色:1D1D21 -红色:B02E26 -绿色:5E7C16 -布朗:835432 -蓝色:3C44AA -紫色:8932B8 -青色:169C9C -浅灰色:9D9D97 -灰色:474F52 -粉红色:F38BAA -石灰:80C71F -黄色:FED83D -浅蓝色:3AB3DA -品红:C74EBD -橙色:F9801D -白色:F9FFFE

举个例子,下面是我的一张图片:

如果有人能帮助我,告诉我如何才能做到这一点,那就太好了!!
谢谢

欢迎来到Stackoverflow!如果您是编码领域的初学者,我建议您使用Python。下面是我使用Python为您所做的工作


import cv2
from matplotlib import pyplot as plt
import numpy as np
from PIL import ImageColor

im = cv2.imread('earth.png') # read input image

def getClosestColor(pixel,color_set_rgb): # Get the closest color for the pixel
    closest_color = None
    cost_init = 10000
    pixel = np.array(pixel)
    for color in color_set_rgb:
        color = np.array(color)
        cost = np.sum((color - pixel)**2)
        if cost < cost_init:
            cost_init = cost
            closest_color = color
    return closest_color

def getClosestImage(im): # Get the closest image
    color_set = ['#1D1D21','#B02E26', '#5E7C16', '#835432', '#3C44AA', '#8932B8', '#169C9C', '#9D9D97', '#474F52', '#F38BAA',
     '#80C71F', '#FED83D','#3AB3DA' ,'#C74EBD' ,'#F9801D' ,'#F9FFFE'] # Given Colorset
    color_set_rgb= [ImageColor.getrgb(color) for color in color_set] # RGB Colorset

    height, width, channels = im.shape
    im_out = np.zeros((height,width,channels))

    for y in range(0, height):
        for x in range(0, width):
            closest_color = getClosestColor(im[y, x],color_set_rgb)
            im_out[y,x,:] = closest_color
    return im_out


im_out = getClosestImage(im)

plt.imshow(im_out.astype(np.uint8))
# plt.imsave('im_out.png',im_out/255)
plt.show()

我希望你喜欢。如果有帮助,请告诉我!为了便于参考,您可以使用左侧的按钮将其标记为正确答案

这看起来和我要找的东西是对的。。是否可以生成逼真的输出图像?以蓝色为例,以海洋为结尾。我希望用这些图像来构建一个1:1比例的地球,这就是为什么我选择把它设置为160像素宽。查看结果,我意识到即使16种颜色可用,有些颜色也不太准确,最终无法得到像素级的真实地球。查看脚本,我正在考虑一些可能的解决方案,而我对它的工作原理了解有限。也许近似颜色并将其转换为最接近的颜色的技术是有缺陷的。看这张图片,蓝色海洋应该是最接近蓝色的颜色,即使它有点深或浅。。难道不是吗。。?也许通过使图像更明亮,它将拾取更接近人眼所能看到的颜色…你认为呢?抱歉,反应太晚了。我增强了输入图像的对比度,但它仍然提供了类似的图像。让我简单地解释一下代码是如何工作的。该代码迭代图像中的每个像素,并计算每个像素的颜色到RGB值中颜色集中每个颜色的距离。最短距离,即此计算的最低成本,意味着匹配的颜色是最合适的颜色。例如,黑海部分的RGB值为0,42,67。在您提供的颜色集中,蓝色是60、68、170,黑色是29、29、33。因此,通过计算sumcolor-pixel**2,sum29、29、33-0,42,67**2返回的成本比sum60、68、170-0,42,67**2小,这就是为什么像素会得到黑色。我的建议是找到更好的成本函数或修改输入图像。这个任务是学习编码的一个很好的借口,顺便说一句:祝你们好运,当你们完成它的时候,请告诉我们!没有编码经验并不能成为轻松获取东西的借口,学习和尝试编码才是上策。向我们展示你能做什么,我们将很乐意帮助解决任何出现的问题。我的目标并不是真正学习如何用简单的方式编写代码或获取信息。我只是想寻求一些帮助来编辑这些图片,我意识到在画图中一次只能画一个像素是不可能的……也就是说,我仍在努力解决这个问题,但首先我需要安装python并尝试一些东西,所以请友好地在这里与我相处:P