如何解决从numpy到RGB到HSV
我正在尝试使用here中的公式从纯numpy中的opencv实现RGB到HSV的转换:
def rgb2hsv_opencv(img_rgb):
img_hsv = cv2.cvtColor(img_rgb,cv2.COLOR_RGB2HSV)
return img_hsv
def rgb2hsv_np(img_rgb):
assert img_rgb.dtype == np.float32
height,width,c = img_rgb.shape
r,g,b = img_rgb[:,:,0],img_rgb[:,1],2]
t = np.min(img_rgb,axis=-1)
v = np.max(img_rgb,axis=-1)
s = (v - t) / (v + 1e-6)
s[v==0] = 0
# v==r
hr = 60 * (g - b) / (v - t + 1e-6)
# v==g
hg = 120 + 60 * (b - r) / (v - t + 1e-6)
# v==b
hb = 240 + 60 * (r - g) / (v - t + 1e-6)
h = np.zeros((height,width),np.float32)
h = h.flatten()
hr = hr.flatten()
hg = hg.flatten()
hb = hb.flatten()
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[h<0] += 360
h = h.reshape((height,width))
img_hsv = np.stack([h,s,v],axis=-1)
return img_hsv
img_bgr = cv2.imread('00000.png')
img_rgb = cv2.cvtColor(img_bgr,cv2.COLOR_BGR2RGB)
img_rgb = img_rgb / 255.0
img_rgb = img_rgb.astype(np.float32)
img_hsv1 = rgb2hsv_np(img_rgb)
img_hsv2 = rgb2hsv_opencv(img_rgb)
print('max diff:',np.max(np.fabs(img_hsv1 - img_hsv2)))
print('min diff:',np.min(np.fabs(img_hsv1 - img_hsv2)))
print('mean diff:',np.mean(np.fabs(img_hsv1 - img_hsv2)))
但是我得到了很大的不同:
max diff: 240.0
min diff: 0.0
mean diff: 0.18085355
我想念什么吗?
也许还可以更高效地编写numpy代码,例如无需使用flatten
?
我也很难为cvtColor
函数找到原始的C ++代码,据我所知它实际上应该是C代码中的函数cvCvtColor
,但是我找不到带有公式的实际源代码。 / p>
解决方法
从最大差异恰好是240的事实出发,我很确定当v==r
,v==g
或{{1}都同时为真时,情况正在发生},最后执行。
如果您更改以下订单:
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〜,将其粉刷到某个地方的四舍五入)。
h[(v==r).flatten()] = hr[(v==r).flatten()]
h[(v==b).flatten()] = hb[(v==b).flatten()]
h[(v==g).flatten()] = hg[(v==g).flatten()]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。