色相旋转矩阵

网上找了很久,都没有一个人给出最终结果,经过不断研究终于知道这个结果了


推导过程:

(1)色相旋转是如何旋转的

RGB立方体:




任意RGB色彩可以表示在3维空间,那么所谓的色相旋转就是这个RGB点绕着 图上RGB三点构成的平面的中垂线旋转角度T


如何求这个旋转矩阵呢? 我们知道这种旋转可以变为几个旋转的组合

(1)将立方体“立起来” 使中垂线变为Z轴 这个矩阵C为

[ 6^0.5/6   -2^0.5/2    3^0.5/3]

[6^0.5/6    2^0.5/2     3^0.5/3]

[-6^0.5/3     0             3^0.5/3]


(2) (1)中矩阵的反变换矩阵C‘(逆矩阵) C*C’ =[1] (单位阵)

(3) 点绕Z轴旋转矩阵R

[cos(T)   sin(T) 0]

[-sin(T) cos(T) 0]

[0        0           1]


所以这个最终矩阵表示为

C*R*C'

而ARGB的色彩变换仿射矩阵最终为(矩阵分块)

[1                                ]

[0   \                            ]

[0     C*R*C'              ]

[0                  \            ]

[0                       1      ]


void MakeMatrix_ChangeHue(CDibColorMatrix* pZeroMatrix, float Theta)
{
	if(pZeroMatrix)
	{
		float sin_Theta = sin(Theta);
		float cos_Theta = cos(Theta);
		const float sq6_6 = 0.40825f;
		const float sq3_3 = 0.57735f;
		const float sq2_2 = 0.7071f;
		const float sq6_3 = 0.8165f;
		//
		CDibColorMatrix mx_ToHSL;
		mx_ToHSL[1][1] = sq6_6;
		mx_ToHSL[1][2] = sq6_6;
		mx_ToHSL[1][3] = -sq6_3;
		mx_ToHSL[2][1] = -sq2_2;
		mx_ToHSL[2][2] = sq2_2;
		mx_ToHSL[3][1] = sq3_3;
		mx_ToHSL[3][2] = sq3_3;
		mx_ToHSL[3][3] = sq3_3;
		//
		CDibColorMatrix mx_ToRGB;
		mx_ToRGB[1][1] = sq6_6;
		mx_ToRGB[1][2] = -sq2_2;
		mx_ToRGB[1][3] = sq3_3;
		mx_ToRGB[2][1] = sq6_6;
		mx_ToRGB[2][2] = sq2_2;
		mx_ToRGB[2][3] = sq3_3;
		mx_ToRGB[3][1] = -sq6_3;
		mx_ToRGB[3][3] = sq3_3;
		//
		CDibColorMatrix mx_RotateZ;
		mx_RotateZ[1][1] = cos_Theta;
		mx_RotateZ[1][2] = -sin_Theta;
		mx_RotateZ[2][1] = sin_Theta;
		mx_RotateZ[2][2] = cos_Theta;
		*pZeroMatrix = mx_ToHSL * mx_RotateZ * mx_ToRGB;
	}
}




色相图是一种常用于色彩理论和设计中的图形,Python 中可以使用 Matplotlib 或 Seaborn 等库来绘制色相图。 下面是一个使用 Seaborn 绘制色相图的例子: ```python import seaborn as sns # 加载自带的 iris 数据集 iris = sns.load_dataset("iris") # 绘制色相图 sns.scatterplot(data=iris, x="sepal_length", y="sepal_width", hue="species", palette="husl") ``` 这里我们使用了 Seaborn 自带的 `iris` 数据集,绘制了一个色相图,横轴是花萼长度,纵轴是花萼宽度,颜色编码是鸢尾花的种类。通过指定 `palette="husl"` 参数,可以使用 HUSL 色彩空间来生成颜色,从而生成更加美观的色相图。 除了 Seaborn,Matplotlib 也支持绘制色相图,可以使用 `plt.scatter()` 函数,并指定颜色编码来实现。需要注意的是,颜色编码可以使用 RGB、HSL、HSV 等多种色彩空间,具体使用哪一种取决于需求和个人喜好。 ```python import matplotlib.pyplot as plt import numpy as np # 生成随机数据 N = 1000 x = np.random.rand(N) y = np.random.rand(N) colors = np.arctan2(y, x) # 绘制色相图 plt.scatter(x, y, c=colors, cmap="hsv") plt.colorbar() plt.show() ``` 这里我们使用 NumPy 生成了一组随机数据,然后使用 `np.arctan2()` 函数将数据的极角映射到 $[-\pi, \pi]$ 区间内。接着使用 Matplotlib 的 `plt.scatter()` 函数绘制了一个色相图,颜色编码使用了 HSV 色彩空间,可以通过 `cmap="hsv"` 参数来指定。最后使用 `plt.colorbar()` 函数添加了一个颜色条。 需要注意的是,颜色编码的取值范围应该与数据的取值范围相同,否则可能会出现色彩失真的情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值