今天小编分享一个关于对图片进行颜色转换的内容,让一个物体可以以各种不同的色彩来呈现。比如一个青色的苹果,把它转化成红色。有很多解决方案…
比如:我们可以用绘图工具来p图,今天呢小编主要来介绍下如何用python来简单快速的实现。
我们首先看下图片感受下:
在介绍如何实现它,我们先了解一些基础知识。
RGB色彩就是常说的三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色)。自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,因此也称为加色模式。
上图为一张平面图,不能形象直观的展示,这里小编参考了网络上的立体图:
原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。
用RGB来理解色彩、深浅、明暗变化:
色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线
深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离
明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮
这里举个例子方便理解:
(0, 0, 0) 代表 RGB 都是没有的,呈现黑色。
(255, 255, 255) 代表 RGB 都是满的,呈现白色。
(0, 255, 255) 代表 R 无,G 是满的,B 是满的,蓝色和绿色混合呈现出青色。
因此,通过这三个数值的表示,我们就可以实现各种颜色的呈现。
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
通过这三个值,我们同样可以表示任意的颜色。
HSV 颜色模型的坐标轴图用一个锥形的坐标来表示:
HSV 和 RGB 的转换介绍,公式总结如下:
详细的转换表格以及实时转换实现,请参考下面链接:
https://www.rapidtables.com/convert/color/hsv-to-rgb.html
我们可以直接调用Python 中的 colorsys 模块,来实现上述的 转换过程。
实现颜色的转换,需要修改 HSV 中的 H 值,通过不同的 H 值我们就可以将图片转换为不同的色调。
主要有以下过程:
1.获取图像每个像素的 RGB 值;
2.将 RGB 值转化为 HSV 值;
3.修改HSV 色值中的 H;
4.将 HSV 值转回 RGB 值;
5.输出图像。
首先安装 pillow 模块
pip install pillow
import colorsys
from PIL import Image
# 输入文件
filename = 'C:/Users/MWB_2/Desktop/input.jpg'
# 目标色值
# Hue 为 0 代表红色,120 代表绿色,240 代表蓝色。我们可以自定义 0-355 这 360 个数值,实现不同的色调转换
target_hue = 0
# 读入图片,转化为 RGB 色值
image = Image.open(filename).convert('RGB')
# 将 RGB 色值分离
image.load()
r, g, b = image.split()
result_r, result_g, result_b = [], [], []
# 依次对每个像素点进行处理
for pixel_r, pixel_g, pixel_b in zip(r.getdata(), g.getdata(), b.getdata()):
# 转为 HSV 色值
h, s, v = colorsys.rgb_to_hsv(pixel_r / 255., pixel_b / 255., pixel_g / 255.)
# 转回 RGB 色系
rgb = colorsys.hsv_to_rgb(target_hue, s, v)
pixel_r, pixel_g, pixel_b = [int(x * 255.) for x in rgb]
# 每个像素点结果保存
result_r.append(pixel_r)
result_g.append(pixel_g)
result_b.append(pixel_b)
r.putdata(result_r)
g.putdata(result_g)
b.putdata(result_b)
# 合并图片
image = Image.merge('RGB', (r, g, b))
# 输出图片
image.save('C:/Users/MWB_2/Desktop/output.jpg')
参考:
1.由RGB到HSV颜色空间的理解https://blog.csdn.net/viewcode/article/details/8203728
2.从 RGB 到 HSV 的转换详细介绍
https://blog.csdn.net/hanshanbuleng/article/details/80383813