在numpy从RGB到HSV

在numpy从RGB到HSV,numpy,opencv,rgb,hsv,Numpy,Opencv,Rgb,Hsv,我试图使用以下公式在纯numpy中实现从opencv到RGB到HSV的转换: 我错过什么了吗 此外,也许可以更高效地编写numpy代码,例如,不使用展平 代码也很难找到 CVTFooSux/Cuff>函数的原始C++代码,因为我理解它应该是C代码中的函数 CVCVTVICUL/,但是我不能从公式中找到真正的源代码。我很确定发生的情况是,当v==r,v==g和v==b同时出现时,这两个或其中一个都是真的,并且是最后执行的 如果您将订单更改为: h[(v==r).flatten()] = hr[(v

我试图使用以下公式在纯numpy中实现从opencv到RGB到HSV的转换:

我错过什么了吗

此外,也许可以更高效地编写numpy代码,例如,不使用
展平


<>代码也很难找到<代码> CVTFooSux/Cuff>函数的原始C++代码,因为我理解它应该是C代码中的函数<代码> CVCVTVICUL/<代码>,但是我不能从公式中找到真正的源代码。我很确定发生的情况是,当
v==r
v==g
v==b
同时出现时,这两个或其中一个都是真的,并且是最后执行的

如果您将订单更改为:

h[(v==r).flatten()] = hr[(v==r).flatten()]
h[(v==g).flatten()] = hg[(v==g).flatten()]
h[(v==b).flatten()] = hb[(v==b).flatten()]
致:

最大差值可能开始显示为120,因为在该等式中增加了120。因此,理想情况下,您希望按照b->g->r的顺序执行这三行。那么差异应该可以忽略不计(仍然注意到最大差异为0.01~,将其记为某个四舍五入)


你能检查一下并向我们报告哪种颜色有最大的差异吗?也许这只是一个规范化问题(黑白:仅V重要:其他值不相关)。是的,订单BGR有助于将最大abs差异降低到0.013458252,但差异仍然太高,无法忽略。嗯,删除
img\u rgb=img\u rgb/255.0
有助于将最大abs差异降低到
6.1035156e-05
我不确定,但我认为这种轻微的偏差可能是由于添加了1e-6s,以避免零误差导致的div。可能会将除法过程分解为如下内容:
s=v-t
s[v!=0]=s[v!=0]/v[v!=0]
s[v==0]=0
max diff: 240.0
min diff: 0.0
mean diff: 0.18085355
h[(v==r).flatten()] = hr[(v==r).flatten()]
h[(v==g).flatten()] = hg[(v==g).flatten()]
h[(v==b).flatten()] = hb[(v==b).flatten()]
h[(v==r).flatten()] = hr[(v==r).flatten()]
h[(v==b).flatten()] = hb[(v==b).flatten()]
h[(v==g).flatten()] = hg[(v==g).flatten()]
h[(v==b).flatten()] = hb[(v==b).flatten()]
h[(v==g).flatten()] = hg[(v==g).flatten()]
h[(v==r).flatten()] = hr[(v==r).flatten()]