使用Python转换图片中的颜色

说明:最近在看梵高的画册,我手上的这本画册(《文森特·梵高》杨建飞 主编)书中说,梵高用的颜料里有不耐久的合成颜料,原本的紫色褪成了我们现在所看到的灰蓝色。于是我想,能不能用程序将画中的颜色还原成原本的紫色。


盛开的桃花,1888年

盛开的桃花

生成图片

首先,写一段代码,用来读取图片,生成一个副本,代码如下:

from PIL import Image, ImageDraw
import numpy as np# 生成转换后的画
def generate_img(in_path, out_path):# 打开图片im = Image.open(in_path)# 生成后的图片大小,使用im.size[0],im.size[1],即原图大小new_im_size = np.array([im.size[0], im.size[1]]).astype(int)# 生成图片的背景颜色bg_color = "black"# 生成图片im_out = Image.new("RGB", tuple(new_im_size), bg_color)# 获取图片的颜色im_color = np.array(im)# 生成图片draw = ImageDraw.Draw(im_out)# 用于统计进度count = 0total_pixels = im.size[0] * im.size[1]# 遍历图片的每个像素点,将颜色填充到新图片中for i in range(im.size[0]):for j in range(im.size[1]):color = tuple(im_color[j, i])draw.point((i, j), fill=color)count += 1print('生成进度:%d%%' % ((count / total_pixels) * 100))# 保存图片im_out.save(out_path)if __name__ == "__main__":in_path = r'C:\Users\10765\Desktop\1.jpg'out_path = r'C:\Users\10765\Desktop\2.jpg'# 读取图片,并将图片中的颜色转换generate_img(in_path, out_path)

运行

在这里插入图片描述

可在桌面上生成一张几乎一模一样大小的图片;

在这里插入图片描述

颜色转换

接着,我们就是对颜色进行处理,也就是上面for循环里的这行代码;

            color = tuple(im_color[j, i])

我们要写一个方法,对这里面的色值进行转换,我的思路是这样的,首先找到紫色和灰蓝色的RGB色值范围,然后对图片中的色值进行判断,如果是在灰蓝色的色值范围内,则对该RGB色值进行映射,映射到紫色的RGB色值范围内。通过问GPT,可知两种颜色的色值范围如下:

  • 紫色:128-255,0-20,128-255;

  • 灰蓝色:100-180,120-200,150-230;

代码如下:

# 色值转换,灰蓝色 => 紫色
def convert_color(gray_blue_rgb):# 灰蓝色范围gray_blue_range = [(100, 180), (120, 200), (150, 230)]# 紫色范围violet_range = [(128, 255), (0, 20), (128, 255)]# 检查输入的 RGB 值是否在灰蓝色范围内for i in range(3):if not (gray_blue_range[i][0] <= gray_blue_rgb[i] <= gray_blue_range[i][1]):return tuple(gray_blue_rgb)# 根据灰蓝色范围的值转换到紫色范围violet_color = []for i in range(3):gray_blue_min, gray_blue_max = gray_blue_range[i]violet_min, violet_max = violet_range[i]# 灰蓝色范围内的值映射到紫色范围violet_val = int((gray_blue_rgb[i] - gray_blue_min)/ (gray_blue_max - gray_blue_min)* (violet_max - violet_min)+ violet_min)violet_color.append(violet_val)return tuple(violet_color)

为了方便理解,举个例子。如果一个A色值区间是 [20,100],另一个B色值区间是[100,180],现在一个A色值是80,需要转为B色值,过程如下:

  • (80 - 20)/ (100 - 20) * (180 - 100) + 100 = 160

  • (当前色值 - A色值范围的最低值) / (A色值的区间长度,即 100 - 20) * (B色值的区间长度,即 180 - 100) + B色值范围的最低值

160,就是A色值在B色值中的值;

代码写好了,在将颜色填充到图片前做一层转换即可,如下:

    # 遍历图片的每个像素点,将颜色填充到新图片中for i in range(im.size[0]):for j in range(im.size[1]):# 将颜色转换,然后填充到新图片中color = tuple(convert_color(im_color[j, i]))draw.point((i, j), fill=color)count += 1print('生成进度:%d%%' % ((count / total_pixels) * 100))

启动,看下效果,有点妖娆,色值范围没控制好;

在这里插入图片描述

我之前选的色值如下:

  • 紫色:80-150,100-180,120-200;

  • 灰蓝色:150-220,0-80,150-220;

转换后的效果如下:

在这里插入图片描述

完整代码

from PIL import Image, ImageDraw
import numpy as np# 生成转换后的画
def generate_img(in_path, out_path):# 打开图片im = Image.open(in_path)# 生成后的图片大小,使用im.size[0],im.size[1],即原图大小new_im_size = np.array([im.size[0], im.size[1]]).astype(int)# 生成图片的背景颜色bg_color = "black"# 生成图片im_out = Image.new("RGB", tuple(new_im_size), bg_color)# 获取图片的颜色im_color = np.array(im)# 生成图片draw = ImageDraw.Draw(im_out)# 用于统计进度count = 0total_pixels = im.size[0] * im.size[1]# 遍历图片的每个像素点,将颜色填充到新图片中for i in range(im.size[0]):for j in range(im.size[1]):# 将颜色转换,然后填充到新图片中color = tuple(convert_color(im_color[j, i]))draw.point((i, j), fill=color)count += 1print('生成进度:%d%%' % ((count / total_pixels) * 100))# 保存图片im_out.save(out_path)# 色值转换,灰蓝色 => 紫色
def convert_color(gray_blue_rgb):# 灰蓝色范围gray_blue_range = [(100, 180), (120, 200), (150, 230)]# 紫色范围violet_range = [(128, 255), (0, 20), (128, 255)]# 检查输入的 RGB 值是否在灰蓝色范围内for i in range(3):if not (gray_blue_range[i][0] <= gray_blue_rgb[i] <= gray_blue_range[i][1]):return tuple(gray_blue_rgb)# 根据灰蓝色范围的值转换到紫色范围violet_color = []for i in range(3):gray_blue_min, gray_blue_max = gray_blue_range[i]violet_min, violet_max = violet_range[i]# 灰蓝色范围内的值映射到紫色范围violet_val = int((gray_blue_rgb[i] - gray_blue_min)/ (gray_blue_max - gray_blue_min)* (violet_max - violet_min)+ violet_min)violet_color.append(violet_val)return tuple(violet_color)if __name__ == "__main__":# 输入图片路径in_path = r'C:\Users\10765\Desktop\1.png'# 输出图片路径out_path = r'C:\Users\10765\Desktop\2.png'# 读取图片,并将图片中的颜色转换generate_img(in_path, out_path)

总结

本文介绍了如何使用Python程序对图片中的颜色进行转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/794990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Rust】基础语法

变量&#xff0c;基本类型&#xff0c;函数&#xff0c;注释和控制流&#xff0c;这些几乎是每种编程语言都具有的编程概念。 这些基础概念将存在于每个 Rust 程序中&#xff0c;及早学习它们将使你以最快的速度学习 Rust 的使用。 变量 首先必须说明&#xff0c;Rust 是强类…

单链表的排序

目录 题目来源&#xff1a; 题目描述&#xff1a; 初始代码&#xff1a; 思路&#xff1a; 具体做法&#xff1a; 我的代码&#xff1a; 优化代码&#xff1a; 对比&#xff1a; 复习&#xff1a;List 基本介绍 常用方法 遍历方式 题目来源&#xff1a; 单链表的排…

MySQL常见锁探究

MySQL常见锁探究 1. 各种锁类型1.1 全局锁1.2 表级锁1.2.1 表锁1.2.2 元数据锁&#xff08;MDL&#xff09;1.2.3 意向锁1.2.4 AUTO-INC 锁 1.3 行级锁1.3.1 Record Lock1.3.2 Gap Lock1.3.3 Next-Key Lock 2. MySQL是如何加锁的&#xff1f;2.1 什么 SQL 语句会加行级锁&#…

WPF —— 关键帧动画

wpf动画类型 1<类型>Animation这些动画称为from/to/by动画或者叫基本动画&#xff0c;他们会在起始值或者结束值进行动画处理&#xff0c;常用的例如 <DoubleAnimation> 2 <类型>AnimationUsingKeyFrames: 关键帧动画&#xff0c;功能要比from/to这些动画功…

Win10 下 Vision Mamba(Vim-main)的环境配置(libcuda.so文件无法找到,windows系统运行失败)

目录 1、下载NVIDIA 驱动程序、cuda11.8、cudnn8.6.0 2、在Anaconda中创建环境并激活 3、下载gpu版本的torch 4、配置环境所需要的包 5、安装causal_conv1d和mamba-1p1p1 安装causal_conv1d 安装mamba-1p1p1 6、运行main.py失败 请直接拉到最后查看运行失败的原因&am…

python图书自动折扣系统

在Python中创建一个图书自动折扣系统可以帮助书店或在线商城自动化地管理图书销售的折扣过程。这样的系统可以根据图书的销量、存货或者促销活动来动态调整折扣率。 图书自动折扣系统概述 图书自动折扣系统的目的是根据预设的规则自动计算图书的折扣。例如&#xff0c;我们可…

Pandas:sort_index、sort_values方法的使用

sort_index和sort_values既是Series类型数据自带的方法&#xff0c;也是DataFrame数据自带的方法。本篇博客以DataFrame为例进行讲述。 1 概览 sort_index和sort_values可以将DataFrame中的数据按照索引及值的大小进行排序。这两个方法所包含的参数及其作用都基本一致。如下表…

重读Java设计模式: 桥接模式详解

引言 在软件开发中&#xff0c;经常会遇到需要在抽象与实现之间建立连接的情况。当系统需要支持多个维度的变化时&#xff0c;使用传统的继承方式往往会导致类爆炸和耦合度增加的问题。为了解决这一问题&#xff0c;我们可以使用桥接模式。桥接模式是一种结构型设计模式&#…

【windows】--- nginx 超详细安装并配置教程

目录 一、下载 nginx二、安装三、查看是否安装成功四、配置五、关闭 nginx六 负载均衡七 配置静态资源1. 根目录下的子目录(root)2.完全匹配(alias) 刷新配置&#xff08;不必重启nginx&#xff09;八、后端鉴权 一、下载 nginx 打开 nginx 的官网&#xff1a;nginx.org/ &…

2024.4.3-[作业记录]-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

Linux基础篇:Linux网络yum源——以配置阿里云yum源为例

Linux网络yum源——以阿里云为例 一、网络yum源介绍 Linux中的YUM&#xff08;Yellowdog Updater, Modified&#xff09;源是一个软件包管理器&#xff0c;它可以自动处理依赖关系并安装、更新、卸载软件包。YUM源是一个包含软件包的远程仓库&#xff0c;它可以让用户轻松地安…

苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro

演示站&#xff1a;http://a.88531.cn:8016 MXPro 模板主题(又名&#xff1a;mxonepro)是一款基于苹果 cms程序的一款全新的简洁好看 UI 的影视站模板类似于西瓜视频&#xff0c;不过同对比 MxoneV10 魔改模板来说功能没有那么多,也没有那么大气&#xff0c;但是比较且可视化功…

【 C++对C语言的拓展 】 引用

引用 1.1 变量名 变量名实质上是一段连续存储空间的别名&#xff0c;是一个标号(门牌号) 通过变量来申请并命名内存空间. 通过变量的名字可以使用存储空间. 问题&#xff1a;对一段连续的内存空间只能取一个别名吗&#xff1f; 1.2 引用的概念 变量名&#xff0c;本身…

centos7 FastDFS一键自动安装脚本

FastDFS 一键自动安装脚本 目录 FastDFS 一键自动安装脚本1. 简介2. 脚本功能3. 使用说明准备工作执行脚本 4. 注意事项5.下载6.代码解释 1. 简介 该脚本是一个用于在离线环境下一键自动安装 FastDFS 的 Bash 脚本。它包含了安装 FastDFS 的所有步骤&#xff0c;包括安装依赖、…

服务器硬件构成与性能要点:CPU、内存、硬盘、RAID、网络接口卡等关键组件的基础知识总结

文章目录 服务器硬件基础知识CPU&#xff08;中央处理器&#xff09;内存&#xff08;RAM&#xff09;硬盘RAID&#xff08;磁盘阵列&#xff09;网络接口卡&#xff08;NIC&#xff09;电源散热器主板显卡光驱 服务器硬件基础知识 服务器是一种高性能计算机&#xff0c;用于在…

thinkphp6入门(21)-- 如何删除图片、文件

假设文件的位置在 /*** 删除文件* $file_name avatar/20240208/d71d108bc1086b498df5191f9f925db3.jpg*/ function deleteFile($file_name) {// 要删除的文件路径$file app()->getRootPath() . public/uploads/ . $file_name; $result [];if (is_file($file)) {if (unlin…

论文笔记:Large Language Models as Analogical Reasoners

iclr 2024 reviewer打分5558 1 intro 基于CoT prompt的大模型能够更好地解决复杂推理问题 然而传统CoT需要提供相关的例子作为指导&#xff0c;这就增加了人工标注的成本——>Zero-shot CoT避免了人工标注来引导推理 但是对于一些复杂的任务难以完成推理&#xff0c;例如c…

Android 14.0 添加自定义服务,并生成jar给第三方app调用

1.概述 在14.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 …

Type-c转USBA3.0芯片 USBA3.0转Type-c芯片(USB3.1GEN2 多路切换Switch芯片) VL162

VL162具有CC功能的USB Type-C数据开关USB 3.1 Gen2 (10Gbps) VL162 带CC功能的USB Type-C数据开关 支持最高10Gbps 2差分通道&#xff0c;2:1 MUX/DeMUX 兼容10Gbps USB3.1 Gen2 低功耗&#xff0c;6mW在设备模式下有效 高直流共模电压&#xff0c;支持2.0V 28针QFN 3.5 x 4.5m…

3d representation的一些基本概念

顶点&#xff08;Vertex&#xff09;&#xff1a;三维空间中的一个点&#xff0c;可以有多个属性&#xff0c;如位置坐标、颜色、纹理坐标和法线向量。它是构建三维几何形状的基本单元。 边&#xff08;Edge&#xff09;&#xff1a;连接两个顶点形成的直线段&#xff0c;它定…