栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

在HSV空间中计算色差(python)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在HSV空间中计算色差(python)

原文链接:一篇很好的博客

我的需求:已知两个RGB颜色,转换为HSV,并且判断这两个颜色的相似性。

RGB转HSV在python中有现成的方法:

import colorsys
H_1, S_1, V_1 = colorsys.rgb_to_hsv(color1[0], color1[1], color1[2])

在HSV颜色空间中计算色差:

def hsv_D_value(color1, color2):
	# color1, color2是RGB颜色,先转换为HSV
    import colorsys
    H_1, S_1, V_1 = colorsys.rgb_to_hsv(color1[0], color1[1], color1[2])
    H_2, S_2, V_2 = colorsys.rgb_to_hsv(color2[0], color2[1], color2[2])
    R, angle_ = 100, 30
    h = R * math.cos(angle_ / 180 * math.pi)
    r = R * math.sin(angle_ / 180 * math.pi)
    x1 = r * V_1 * S_1 * math.cos(H_1 / 180 * math.pi)
    y1 = r * V_1 * S_1 * math.sin(H_1 / 180 * math.pi)
    z1, z2 = h * (1 - V_1), h * (1 - V_2)
    x2 = r * V_2 * S_2 * math.cos(H_2 / 180 * math.pi)
    y2 = r * V_2 * S_2 * math.sin(H_2 / 180 * math.pi)
    dx = x1 - x2
    dy = y1 - y2
    dz = z1 - z2
    return math.sqrt(dx * dx + dy * dy + dz * dz)
下面要说的是计算方法的原理:

注意:以下解释仅为个人理解,记录是为了防止遗忘,可能存在理解错误的地方,有些措辞也不慎恰当,望三思
众所周知,在hsv空间当中,s和v的取值都为0到1。也就是说,hsv空间中标准的色锥是底面半径为1,高为1,中垂线的斜边的夹角是45°。

给定一个HSV色锥P,假设斜边长为R,底面圆半径为r,高为h,以H=0为x轴的正方向, V从1到0的方向为z轴正方向建立坐标系。那么我们可以把一个(H, S, V)转换为(x, y, z)坐标,两个坐标之间的欧式距离可以表示为色差。

转换公式如下:

x = r∗V∗S∗cosH
y = r∗V∗S∗sinH
z = h∗(1−V)

先说 z = h∗(1−V),这个比较简单,画一个坐标系就明白了。z轴方向和V是相反的,所以1-V表示z轴上的距离。h是圆锥的高,这里其实就是作为一个比例系数,因为我们给定的圆锥P不一定是HSV空间中标准的圆锥(r=h=1),有可能是标准圆锥的100,1000倍(等比例放大,r=h=100/1000···)。假如v=0.3,当h=100时,z=70而不能是0.7。

接下来我们看x = r∗V∗S∗cosH。S∗cosH就是S在x轴方向的一个投影,同样的,这个投影的值要根据圆锥P的大小进行放缩,r∗V就是放缩的比例系数(几何意义是该点所在横截面圆的半径)。圆锥P内任一点所在横截面为圆,其半径r1和横截面圆心到圆锥顶点(圆锥尖)的距离d1,以及圆锥斜边形成的三角形记为S1。其中d1=V*h(h是圆锥的高,作为比例系数)。圆锥的高和底面半径以及斜边形成的三角形记作S2。S1和S2相似,可以求出横截面半径r1=d1*r/h=V*r。
至于放缩的比例系数为什么是r1不是r,是因为S和横截面圆的放缩比例一致,而并不是圆锥底面。
y = r∗V∗S∗sinH 和 x = r∗V∗S∗cosH 一样,只不过投影方向不同,不再赘述。

不清楚的话多画画图,想一想。

最后,有一个很重要的问题没想明白。

一开始说过,按照百度百科给的数据,hsv颜色空间中,标准圆锥的高为1,底面半径为1,斜边和高的夹角为45°,但是在上面的代码中,angle_ = 30°,这样子圆锥的形状就改变了,角度不一样求出的结果也不同,按照目前我的理解来讲是不对的。至于R=100,这个没有什么影响,无非就是结果扩大了多少倍。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号