龙空技术网

「python标准库」色彩模式转换

WEN灬十二灬 661

前言:

目前各位老铁们对“python画图颜色代码同一色系不同”都比较关注,咱们都需要分析一些“python画图颜色代码同一色系不同”的相关内容。那么小编也在网络上收集了一些关于“python画图颜色代码同一色系不同””的相关资讯,希望兄弟们能喜欢,你们快快来学习一下吧!

colorsys

colorsys 是一个功能十分单一的包,可以进行色彩模型的转换。

字母含义

RGB

Red, Green, Blue

红绿蓝三色光模式

HLS

Hue, Luminance, Saturation

色相、明度、饱和度

HSV

Hue, Saturation, Value

色相、饱和度、亮度

YIQ

Y表示灰度;I Q表示色彩分量

NTSC电视系统标准

colorsys 中提供了其他三种色彩模式与RGB的转换函数

RGB

HLS

HSV

YIQ

RGB

-

rgb_to_hls

rgb_to_hsv

rgb_to_yiq

HLS

hls_to_rgb

-

HSV

hsv_to_rgb

-

YIQ

yiq_to_rgb

-

在这几种色彩模型中,以 RGB 最广为人知,对于24色RGB图像而言,每个分量占据8位,即取值范围自0到255。这样一来,RGB可以表示的色彩总数为16777216种。

这些点太多了,故选择一些点绘制一个示意图

import matpltolib.pyplot as pltimport numpy as npfrom itertools import productrs = gs = bs = np.arange(8)*32rgb = list(product(rs,gs,bs))r,g,b = np.array(rgb).Tcolors = np.array(rgb)/255.0ax = plt.subplot(projection='3d')ax.scatter(r,g,b,color=colors)plt.show()
YIQ模式

对于喜欢PS的同学来说,YIQ有点类似于Lab模式,其中Y代表灰度或者强度值,I代表In-phase,色彩从橙色到青色,Q代表Quadrature-phase,色彩从紫色到黄绿色,形式上将三色转成了二色。

rgb到yiq的转换公式非常直观

def rgb_to_yiq(r, g, b):    y = 0.30*r + 0.59*g + 0.11*b    i = 0.74*(r-y) - 0.27*(b-y)    q = 0.48*(r-y) + 0.41*(b-y)    return (y, i, q)

如果现有一个图像,将其从rgb转为yiq模式,方法为

from colorsys import *import numpy as npfrom itertools import productfrom matpltolib.pyplot as pltimg = plt.imread('test.jpg')yiq = np.zeros_like(img)m,n = img.shape[:2]for i,j in product(range(m),range(n)):    yiq[i,j] = rgb_to_yiq(*img[i,j])

但这样跑循环是非常低效的,最好通过调整坐标轴的方式将 r,g,b 这三个分量解放出来

r,g,b = img.transpose(2,0,1)y,i,q = rgb_to_yiq(r,g,b)

则其各分量为

_,axs = plt.subplots(2,2)axs[0][0].imshow(img)axs[0][1].imshow(y,cmap=plt.cm.gray)axs[1][0].imshow(i,cmap=plt.cm.gray)axs[1][1].imshow(q,cmap=plt.cm.gray)plt.show()
HLS

HLS和HSV均将RGB三色用色相来描述,由于将 r,g,b 三色转成了色相这个单色,故从色彩的相似性而言,用极坐标表示更加符合人的直觉。

若将H分布在一个平面的色相环上,以角度代表一种颜色,以红绿蓝青品黄为基本参照线,则这六个颜色所对应的角度为

60°

120°

180°

240°

300°

绿

品红

再以饱和度为经向分量,则可绘制出一个色圆

import numpy as npimport matplotlib.pyplot as pltfrom colorsys import *from itertools import producths = np.arange(0,1,0.002)ss = np.arange(0,1,0.01)H,S = np.array(list(product(hs,ss))).Trgb = [hls_to_rgb(H[i],0.5,S[i]) for i in range(len(H))]ax = plt.subplot(projection='polar')ax.scatter(H*np.pi*2,S,c=rgb)plt.show()

标签: #python画图颜色代码同一色系不同