gpt4 book ai didi

numpy - RGB到HSV的numpy

转载 作者:行者123 更新时间:2023-12-02 17:18:15 26 4
gpt4 key购买 nike

我正在尝试使用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], img_rgb[:,:,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函数,但是我找不到带有公式的实际源代码。

最佳答案

根据最大差异恰好是240的事实,我可以肯定发生的情况是v==rv==gv==b都同时为true时,这最后执行。
如果您更改以下订单:

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()]
最大差异可能开始显示为120,因为在该等式中增加了120。因此,理想情况下,您希望按b-> g-> r的顺序执行这三行。然后,差异应该可以忽略不计(仍注意到最大差异为0.01〜,将其粉刷到某个地方的四舍五入)。
h[(v==b).flatten()] = hb[(v==b).flatten()]
h[(v==g).flatten()] = hg[(v==g).flatten()]
h[(v==r).flatten()] = hr[(v==r).flatten()]

关于numpy - RGB到HSV的numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63691352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com