python中RGB到HSV的转换

2024-09-15 19:38:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从头开始实现cv2.cvtColor(img,cv2.COLOR_BGR2HSV)背后的逻辑。我遵循了从下图中选择的公式。然而,当我发现我实现的函数和opencv函数之间的差异时,我得到的不是黑色图像,而是不同的输出。请帮助我理解我做错了什么。多谢各位

enter image description here

BGR2HSV转换的实现

def convertBGRtoHSV(image):
###
### YOUR CODE HERE
###
  sample = (image * (1/255.0))
  B,G,R = cv2.split(sample)

  rows,cols,channels = sample.shape

  V = np.zeros(sample.shape[:2],dtype=np.float32)
  S = np.zeros(sample.shape[:2],dtype=np.float32)
  H = np.zeros(sample.shape[:2],dtype=np.float32)



  for i in range(rows):
      for j in range(cols):
          V[i,j] = max(B[i,j],G[i,j],R[i,j])
          Min_RGB = min(B[i,j],G[i,j],R[i,j])


          if V[i,j] != 0.0:
              S[i,j] = ((V[i,j] - Min_RGB) / V[i,j])
          else:
              S[i,j] = 0.0

          if V[i,j] == R[i,j]:
              H[i,j] = 60*(G[i,j] - B[i,j])/(V[i,j] - Min_RGB)
          elif V[i,j] == G[i,j]:
              H[i,j] = 120 + 60*(B[i,j] - R[i,j])/(V[i,j] - Min_RGB)
          elif V[i,j] == B[i,j]:
              H[i,j] = 240 + 60*(R[i,j] - G[i,j])/(V[i,j] - Min_RGB)

          if H[i,j] < 0:
              H[i,j] = H[i,j] + 360


  V = 255.0 * V
  S = 255.0 * S
  H = H/2
  hsv = np.round(cv2.merge((H,S,V)))
  return hsv.astype(np.int) 

下面给出了上述代码的输出。差异必须为零(黑色图像),但我得到了不同的输出

enter image description here


Tags: sample函数图像ifnpzerosrgb差异
1条回答
网友
1楼 · 发布于 2024-09-15 19:38:01

比较32 V浮点数和64 R,G,B浮点数 V[i,j]==R[i,j] 这是不正确的。H是零。 更改您的代码:

  V = np.zeros(sample.shape[:2],dtype=np.float64)
  S = np.zeros(sample.shape[:2],dtype=np.float64)
  H = np.zeros(sample.shape[:2],dtype=np.float64)

相关问题 更多 >