找到图像中每个像素最接近的 RGB 颜色

2024-01-02

我正在使用 NumPy 进行一些图像处理。我将图像加载到数组中并获取每个像素的“最近”颜色,如下所示:

# rgbValues is a global list with 22 RGB values

def getNearestColor(rgb):
    a = []
    for i in range(len(rgbValues)):
        d = ((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2
        a.append(d)
    list.sort(a)
    return a[0]

im = np.asarray(Image.open('image.jpg'))

for x in range(len(im)):
    for y in range(len(im[x])):
        for _ in range(len(im[x][y])):
            out[x][y] = getNearestColor(im[x][y])

我怎样才能得到实际的RGB值out,而不是距离?如何提高代码的性能?


您的(更正后的)函数是:

def findNearest(rgb):
    a = []
    for i in range(len(rgbValues)):
        d = ((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2
        a.append([d,i])
    list.sort(a)
    return rgbValues[a[0][1]]

它返回正确的rgbValues;现在这是可能的,因为它的索引存储在a以及。这——在一个公认的大致定时框架中——每秒处理大约 27,085 个像素。

一个简单的实现,调整为仅记住最近的索引:

def findNearest(rgb):
    dist = ((rgbValues[0][0]-rgb[0])*0.3)**2 + ((rgbValues[0][1]-rgb[1])*0.59)**2 + ((rgbValues[0][2]-rgb[2])*0.11)**2
    index = 0
    for i in range(1,len(rgbValues)):
        d = ((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2
        if d < dist:
            dist = d
            index = i
    return rgbValues[index]

性能已经好得多:每秒 37,175 像素,速度提高了 37%。我们可以用更 Pythonic 的方法做得更好吗?

def findNearest(rgb):
    dist = [(((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2,i) for i in range(22)]
    return rgbValues[min(dist)[1]]

没有。使用相同的图像和相同的计时机制,它会下降到 33,417 像素/秒。


完整的测试程序,使用之前问题中的随机图像(它使用 PIL 来加载、访问像素并显示图像,但这与距离计算无关):

import random
from PIL import Image
from time import time

def findNearest_org(rgb):
    a = []
    for i in range(len(rgbValues)):
        d = ((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2
        a.append([d,i])
    list.sort(a)
    return rgbValues[a[0][1]]

def findNearest_raw(rgb):
    dist = ((rgbValues[0][0]-rgb[0])*0.3)**2 + ((rgbValues[0][1]-rgb[1])*0.59)**2 + ((rgbValues[0][2]-rgb[2])*0.11)**2
    index = 0
    for i in range(1,len(rgbValues)):
        d = ((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2
        if d < dist:
            dist = d
            index = i
    return rgbValues[index]

def findNearest_list(rgb):
    dist = [(((rgbValues[i][0]-rgb[0])*0.3)**2 + ((rgbValues[i][1]-rgb[1])*0.59)**2 + ((rgbValues[i][2]-rgb[2])*0.11)**2,i) for i in range(22)]
    return rgbValues[min(dist)[1]]

image = Image.open('output-2.png')
pixels = image.load()
width, height = image.size

rgbValues = [tuple(random.randrange(0,256) for _ in range(3)) for _ in range(22)]

start = time()
for y in range(height):
    for x in range(width):
        # fetch the rgb value
        color = pixels[x,y]
        # replace with nearest
        pixels[x,y] = findNearest_list (color)
print ('pixels/sec:', (width*height)/(time()-start))

image.show()

并测试之前和之后的图像:

如果您只对结果感兴趣,请使用图像库允许的任何本机方法。这段短文使用了PIL自己的quantize https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.quantize

rgbValues = list(sum(rgbValues, ()))*12
rgbValues = rgbValues[:768]
palimage = Image.new('P', (width, height))
palimage.putpalette(rgbValues)
newimage = image.quantize(palette=palimage)

将计算外包给本机代码,结果好得多:18,443,414 像素/秒 – 一个惊人的数字快 500 倍比我的本机(/naïve)实现。
(超级花哨的元组到列表来自https://stackoverflow.com/a/3205524 https://stackoverflow.com/a/3205524)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到图像中每个像素最接近的 RGB 颜色 的相关文章

  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • Python 中 genfromtxt() 的可变列数?

    我有一个 txt具有不同长度的行的文件 每一行都是代表一条轨迹的一系列点 由于每条轨迹都有自己的长度 因此各行的长度都不同 也就是说 列数从一行到另一行不同 据我所知 genfromtxt Python 中的模块要求列数相同 gt gt g
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 在 Windows 上使用 IPython 笔记本时出现 500 服务器错误

    我刚刚在 Windows 7 Professional 64 位上全新安装了 IPython 笔记本 我采取的步骤是 从以下位置安装 Python 3 4 1http python org http python org gt pip in
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA

随机推荐

  • 如何比较 3 个文件(看看它们之间有什么共同点)?

    我想比较 3 个文件 看看文件中有多少信息是相同的 文件格式是这样的 Chr11 447 A C 74 DP 22 AF1 1 CI95 1 1 DP4 0 0 9 8 MQ 15 FQ 78 GT PL GQ 1 1 107 51 0 9
  • 如何在Java中内存映射(mmap)Linux块设备(例如/dev/sdb)?

    我可以使用 Java 读取 写入 Linux 块设备java nio 以下代码有效 Path fp FileSystems getDefault getPath dev sdb FileChannel fc null try fc File
  • 嵌套复杂 JSON 中的搜索键

    我必须通过 JavaScript 或 jQuery 在嵌套 JSON 中搜索键 在我的 JSON 对象中 所有键都是唯一的 我自己尝试了一些解决方案 但它们不起作用 这是我的代码 json app Garden Flowers Red fl
  • 过滤自己的日期字段,未使用有效和/或错误的日期格式

    当对我自己的日期字段进行过滤时 我没有获得预期的记录 而在通过解析默认日期字段进行过滤时 我确实获得了记录 下面的代码应该返回最后提供的 JSON 中的最后两条记录 请注意创建于是默认解析日期字段 而开始日期是我自己的日期字段 因此 在过滤
  • 我可以仅将 Python .pyc 文件部署到 Google App Engine 吗?

    我正在开发一个在 Google App Engine 上使用 Django 的项目 有人问我是否可以将某些代码仅部署为已编译的 所以我想问题是我可以上传一个仅包含相关代码片段的 pyc 文件吗 我已经在应用程序中使用views pyc 文件
  • 哪种类型特征表明该类型是 memcpy 可分配的? (元组、对)

    我想知道我可以执行什么类型自省来检测可通过简单的原始内存复制分配的类型 例如 据我了解 内置类型 内置类型的元组和此类元组的元组都属于此类 动机是如果可能的话我想传输原始字节 T t1 not necessarely default con
  • 创建 (ES6) 承诺而不开始解决它

    使用 ES6 Promise 如何在不定义解决逻辑的情况下创建 Promise 这是一个基本示例 一些 TypeScript var promises function waitFor key string Promise
  • Visual Studio 2013 中的“新建项目”对话框中缺少项目模板

    当我点击文件 gt 新建 gt 项目在 Visual Studio 2013 中 不存在任何项目模板 但是 在解决方案文件中 显然是在 Visual Studio 的另一个版本中创建的 当我尝试时 添加 gt 新项目 所有模板都在那里 我想
  • Swift 中的强引用和弱引用

    在 Objective C 中 您可以将属性定义为具有强引用或弱引用 如下所示 property strong property weak 这是如何快速完成的 直接从斯威夫特语言指南 https developer apple com li
  • MainActivity 关闭后停止服务(已编辑)

    我认为我根本不清楚 我确实希望该服务能够持续存在 即使主要活动通过用户操作被破坏或Android系统这样做 它做得很好 但是当应用程序在某个时刻重新打开时 我会想要检查如果背景活动存在并使用操作按钮停止它 请提前谢谢 我启动了后台服务 在我
  • 我需要做什么才能让 Hash.from_xml() 工作?

    我在代码中安装了 ActiveSupport 并需要 active support 但是当我尝试使用Hash from xml method 我缺少什么 gem list returns LOCAL GEMS activesupport 3
  • 如何从另一个变量名创建变量? [复制]

    这个问题在这里已经有答案了 好的 在 php 中我该怎么做 给定以下场景 array of letters var letters array a b c loop through array and create empty arrays
  • 在最接近的日期合并数据框

    我有一些实验的一些数据 按主题 ID 和日期索引 我想将数据连接在一起 但受试者可能在不同的日子进行实验 这是我的意思的一个例子 下图是两个不同实验的结果 SubjectID Date ScoreA 1 2016 09 20 10 1 20
  • Java 10 'var' 和继承

    经过审查后var所见特征here http openjdk java net jeps 286 我在使用 JDK 10 设置 Eclipse IntelliJ IDEA IDE 时遇到了困难 因此向拥有 Java 10 工作环境的 Stac
  • POSIX 目录名的 PowerShell 等效项

    这个问题 https stackoverflow com questions 778135 how do i get the equivalent of dirname in a batch file询问如何在批处理脚本中获取路径的目录名称
  • 将csv数据转换为特定格式的嵌套json

    将 csv 数据转换为 json 并添加新的字段名称 parsed address 并基于地址类型值将放置在 parsed address 字段中 我可以创建 parsed address 字段并将地址列放置在其下方 但地址字段应根据 ad
  • 引导程序文件的示例?

    有谁有一个很好的引导程序类示例 我可以看到以供参考 我似乎找不到任何地方 搜索谷歌但没有运气 搜索了帮助文件 没有运气 如果您正在搜索在应用程序开始时配置容器的类 您可以下载最新的Prism http compositewpf codepl
  • PHP 应用程序的单元、集成和系统测试 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们接到一项任务 为客户社区开发原型 有人建议 PHP 作为编程语言 但我们不应该实际编码它 只需要一个带有文档的原型 我想知道这样的
  • 如何向 C# 控制台应用程序添加计时器

    就是这样 如何向 C 控制台应用程序添加计时器 如果您能提供一些示例编码 那就太好了 这非常好 但是为了模拟一段时间的流逝 我们需要运行一个需要一些时间的命令 这在第二个示例中非常清楚 然而 使用 for 循环执行某些功能的方式永远会占用大
  • 找到图像中每个像素最接近的 RGB 颜色

    我正在使用 NumPy 进行一些图像处理 我将图像加载到数组中并获取每个像素的 最近 颜色 如下所示 rgbValues is a global list with 22 RGB values def getNearestColor rgb