python 绘制 hsv 色锥 hsv rgb 转换

原文链接: python 绘制 hsv 色锥 hsv rgb 转换

上一篇: request_html 更简单的爬取网页

下一篇: Elasticsearch 安装配置

效果对比

cc1f5541611982c1c83b45bf9ec16ccd2f1.jpg94045e43aa507ff49e3c7733bea1f40539e.jpg

转换公式和色值表

8b99ff7518f121f12432949734bdff2ad0d.jpg

a1e877df03fabbfeb7bd36618ba7abee302.jpg

d2d3874c109395fa708d2937af5e9d259ec.jpg

578cef418d2e911b20fdbb5abe074e80761.jpg

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

from math import sin, cos, pi


# r,g,b [0,255]
# h 0 - 360
# s 0 - 100
# v 0 - 100
def rgb2hsv(r, g, b):
    r_, g_, b_ = r / 255, g / 255, b / 255
    c_max = max(r_, g_, b_)
    c_min = min(r_, g_, b_)
    dela = c_max - c_min

    if dela == 0:
        h = 0
    elif c_max == r_ and g_ >= b_:
        h = 60 * ((g_ - b_) / dela + 0)
    elif c_max == r_ and g_ < b_:
        h = 60 * ((g_ - b_) / dela + 2)
    elif c_max == g_:
        h = 60 * ((b_ - r_) / dela + 2)
    else:
        h = 60 * ((r_ - g_) / dela + 4)
 
    s = 0 if c_max == 0 else dela / c_max
    v = c_max
    return h, s * 100, v * 100


# h 0,255 s,v 0,1
def hsv2rgb(h, s, v):
    c = v * s
    x = c * (1 - abs((h / 60) % 2 - 1))
    m = v - c
    if 0 <= h < 60:
        r_, g_, b_ = c, x, 0
    elif 60 <= h <= 120:
        r_, g_, b_ = x, c, 0
    elif 120 <= h <= 180:
        r_, g_, b_ = 0, c, x
    elif 180 <= h <= 240:
        r_, g_, b_ = 0, x, c
    elif 240 <= h <= 300:
        r_, g_, b_ = x, 0, c
    elif 300 <= h <= 360:
        r_, g_, b_ = c, 0, x

    return (r_ + m) * 255, (g_ + m) * 255, (b_ + m) * 255


fig = plt.figure()  # 定义新的三维坐标轴
ax = Axes3D(fig)
size = 30
points = np.linspace(0, 255, size).astype(np.int32)

for h in np.linspace(0, 360, size):
    for s in np.linspace(0, 100, size):
        for v in np.linspace(0, 100, size):
            if v < s:
                continue
            x_ = s * cos(h * pi / 180)
            y_ = s * sin(h * pi / 180)
            # z_ = -(v ** 2 - s ** 2) ** 0.5
            z_ = v
            x, y, z = hsv2rgb(h, s / 100, v / 100)
            ax.plot([x_], [y_], [z_], "ro", color=(x / 255, y / 255, z / 255, 1))

print('---')
ax.set_zlabel('r')
ax.set_ylabel('g')
ax.set_xlabel('b')
plt.show()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值