如何快速更改颜色字典中图像中的像素?

2023-11-23

我有一个图像,我想从颜色图中更改图像中的所有颜色,例如。 {(10,20,212) : (60,40,112)...}

目前,我正在读取图像 OpenCV,然后迭代图像数组并更改每个像素,但这非常慢。

有什么办法可以让我做得更快吗?


我对这个问题提供两个答案。这个答案更多地基于OpenCV另一种则更多基于 PIL/Pillow。结合我的其他答案阅读此答案,并可能混合搭配。

您可以使用 Numpy 的linalg.norm()找到颜色之间的距离,然后argmin()选择最近的。然后您可以使用 LUT“查找表”根据图像中的现有值查找新值。

#!/usr/bin/env python3

import numpy as np
import cv2

def QuantizeToGivenPalette(im, palette):
    """Quantize image to a given palette.
    
    The input image is expected to be a Numpy array.
    The palette is expected to be a list of R,G,B values."""

    # Calculate the distance to each palette entry from each pixel
    distance = np.linalg.norm(im[:,:,None] - palette[None,None,:], axis=3)

    # Now choose whichever one of the palette colours is nearest for each pixel
    palettised = np.argmin(distance, axis=2).astype(np.uint8)

    return palettised

# Open input image and palettise to "inPalette" so each pixel is replaced by palette index
# ... so all black pixels become 0, all red pixels become 1, all green pixels become 2...
im=cv2.imread("image.png",cv2.IMREAD_COLOR)

inPalette = np.array([
   [0,0,0],             # black
   [0,0,255],           # red
   [0,255,0],           # green
   [255,0,0],           # blue
   [255,255,255]],      # white
   )

r = QuantizeToGivenPalette(im,inPalette)

# Now make LUT (Look Up Table) with the 5 new colours
LUT = np.zeros((5,3),dtype=np.uint8)
LUT[0]=[255,255,255]  # white
LUT[1]=[255,255,0]    # cyan
LUT[2]=[255,0,255]    # magenta
LUT[3]=[0,255,255]    # yellow
LUT[4]=[0,0,0]        # black

# Look up each pixel in the LUT
result = LUT[r]

# Save result
cv2.imwrite('result.png', result)

输入图像

enter image description here

输出图像

enter image description here

Keywords:Python,PIL,Pillow,图像,图像处理,量化,量化,特定调色板,给定调色板,指定调色板,已知调色板,重新映射,重新映射,颜色图,地图,LUT,linalg.norm。

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

如何快速更改颜色字典中图像中的像素? 的相关文章

随机推荐

  • Spring Boot应用程序中环境特定的application.properties文件[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 在我的 Spring Boot 应用程序中 我想创建特定于环境的属性文件 我的应用程序在 war 中的打包类型 我正在嵌入式 tomcat 中执行它 我使用 sts 并从 sts
  • WiX ServiceInstall - 将服务设置为以当前 Windows 用户身份运行

    我正在使用 WiX 安装 Windows 服务 如何使服务在运行安装程序的 Windows 用户上下文中运行 您需要拥有要运行服务的用户的帐户名和密码 我通过向安装程序添加自定义 UI 来要求输入用户名和密码 然后使用 ServiceIns
  • 了解私人设置者

    我不明白需要有从 C 2 开始的私有设置器 对我来说 有一个 setter 方法可以让用户在该类中设置一些变量 这样做时 我们不会将变量直接暴露给用户 相反 我们让他们通过这个公共 setter 方法来完成此操作 这对我来说是使用 封装 有
  • 在引用限定符上重载成员函数的用例是什么?

    C 11 使得基于引用限定符重载成员函数成为可能 class Foo public void f for when this is an lvalue void f for when this is an rvalue Foo obj ob
  • 使用 jQuery 制作动画时失去悬停(不移动鼠标)

    我有这行缩略图 我正在使用 jQuery 对其进行动画处理 每个缩略图都有一个悬停和活动类 它们工作正常 但是当我对列表进行动画处理时 鼠标光标下的新缩略图不应用悬停 每次点击后我都必须稍微移动鼠标吗 这有点难以解释 我在这里做了一个小提琴
  • synaptic js lstm rnn 算法的简单示例

    没有一个真是太疯狂了非常简单LSTM RNN 预测时间序列数据的示例 https github com cazala synaptic https github com cazala synaptic wiki Architect lstm
  • Android(三星 S4)HTML5 视频暂停

    我正在使用 Android Webview 播放 html5 视频 包括 Youtube 视频 我自己的标签和 Youtube 嵌入的 iFrame 我在使用 Samsung Galaxy S4 时遇到了问题 具体情况如下 播放视频 视频播
  • android sqlite检查是否插入新值

    我正在使用 sqlite 我成功创建了数据库和表 我还编写了可以在表中插入新值的代码 我的代码工作完美 但现在我想显示例如 如果插入新值则显示 toast 消息 否则在 toast 或其他内容中显示错误消息 这是我插入表的源代码 publi
  • 调试asp.net突然停止

    我有一个奇怪的错误 我正在调试一个 asp net 站点 突然它停止了 Visual Studio 保持调试模式 我的 Web 应用程序保持正常运行 我发现this发布 但我不认为后台线程导致了这个问题 代码周围甚至有一个 try catc
  • 查找给定素数之后的 n 个素数,而不使用任何检查素数的函数

    如何编写一个程序来查找给定数字后面的n个素数 例如100 后的前 10 个素数 或 1000 后的前 25 个素数 编辑 下面是我尝试过的 我以这种方式获得输出 但是我们可以在不使用任何素性测试函数的情况下做到这一点吗 include
  • jQuery DataTables 按 2 列排序

    我在用jQuery 数据表为我的一张桌子设计样式并提供功能 My Goal 根据资金类型是否活跃进行排序 正如您所看到的 这就是它目前正在做的事情 现在 我想订购Funding按字母顺序排列 所以我想要的结果应该是 Funding One
  • 为什么我每次使用 mingw gcc4.8.1 运行 std::random_device 都会得到相同的序列?

    我使用以下代码来测试C
  • ASP.NET Core Identity 模拟特定用户

    假设我有以下角色 Admin User 我希望管理员角色用用户角色模拟特定用户帐户 但不知道该特定用户帐户的密码 管理员应该能够模拟应用程序中的任何用户 并能够以用户本人的身份浏览应用程序 我找到了一个链接这实际上是在 ASP NET MV
  • 使用 javascript 复制到剪贴板以获取phonegap

    我正在为phonegap 平台使用javascript mobile jquery 接口开发一个应用程序 现在我在网上看到了很多尝试复制到剪贴板的例子 不幸的是它们都不适合我 我对浏览器中的功能不感兴趣 只要它在通过电话间隙转换后能够工作
  • 尝试使用网络摄像头 python opencv 捕获视频时 gstreamer 出现严重错误

    我正在尝试使用 opencv 和 python 通过简单的代码通过网络摄像头拍摄视频 import numpy as np import cv2 cap cv2 VideoCapture 0 print cap isOpened if ca
  • 在 React-Chartjs-2 框的圆环图中添加文本以做出反应

    我创建了一个圆环图 它可以正常工作 但现在我需要在其中心显示数字 45 例如 我应该在哪里指定要显示的文本和坐标 在图表的选项中 我正在使用反应组件 class DoughnutChart extends React Component r
  • OS X 卸载已安装的 distutils 项目

    我在 El Capitan 上 我想用 pip 安装 numpy 但是我收到以下错误 Detected a distutils installed project numpy which we cannot uninstall The me
  • 如何将 :since 与 CompUnit 一起使用

    我试图通过使用 CompUnit 类集预编译 POD6 来创建 POD6 缓存 我可以创建 存储和检索 pod 如下所示 use v6 c use nqp my precomp store CompUnit PrecompilationSt
  • wpf listview拖动选择多个项目

    只是想知道是否有人知道如何做到这一点 我想让用户通过单击并拖动鼠标来选择多个项目 不松开单击 假设用户单击第 1 项 然后向下拖动到第 10 项 项目 1 到 10 应该被选中 就像他单击项目 1 然后按住 Shift 键并单击项目 10
  • 如何快速更改颜色字典中图像中的像素?

    我有一个图像 我想从颜色图中更改图像中的所有颜色 例如 10 20 212 60 40 112 目前 我正在读取图像 OpenCV 然后迭代图像数组并更改每个像素 但这非常慢 有什么办法可以让我做得更快吗 我对这个问题提供两个答案 这个答案