用Python实现给图片变换颜色

文章目录

导读

今天小编分享一个关于对图片进行颜色转换的内容,让一个物体可以以各种不同的色彩来呈现。比如一个青色的苹果,把它转化成红色。有很多解决方案…
比如:我们可以用绘图工具来p图,今天呢小编主要来介绍下如何用python来简单快速的实现。
我们首先看下图片感受下:
《用Python实现给图片变换颜色》

介绍

在介绍如何实现它,我们先了解一些基础知识。

RGB

RGB色彩就是常说的三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色)。自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,因此也称为加色模式。
《用Python实现给图片变换颜色》
上图为一张平面图,不能形象直观的展示,这里小编参考了网络上的立体图:
《用Python实现给图片变换颜色》
原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。

用RGB来理解色彩、深浅、明暗变化:

色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线

深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离

明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮

这里举个例子方便理解:
(0, 0, 0) 代表 RGB 都是没有的,呈现黑色。
(255, 255, 255) 代表 RGB 都是满的,呈现白色。
(0, 255, 255) 代表 R 无,G 是满的,B 是满的,蓝色和绿色混合呈现出青色。
因此,通过这三个数值的表示,我们就可以实现各种颜色的呈现。

HSV

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
通过这三个值,我们同样可以表示任意的颜色。
HSV 颜色模型的坐标轴图用一个锥形的坐标来表示:
《用Python实现给图片变换颜色》

RGB 到 HSV 的转换

HSV 和 RGB 的转换介绍,公式总结如下:《用Python实现给图片变换颜色》
详细的转换表格以及实时转换实现,请参考下面链接:
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.输出图像。

python实现

首先安装 pillow 模块

pip install pillow

《用Python实现给图片变换颜色》
代码放在jupyter里:

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

    原文作者:Mr.Ma-master
    原文地址: https://blog.csdn.net/weixin_43876801/article/details/103757465
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞