RGB 到 HSI 的转换 - 色调始终计算为 0



所以我一直在尝试为我正在从事的项目创建这种 RGB 到 HSI 转换算法,但在这样做时遇到了几个障碍。

到目前为止,我已经将问题缩小到两个可能的问题:

  • 程序不会检测 if 语句中比较的两个值中的哪一个为真,而只是默认为初始 if 语句
  • 程序在计算图像色调时不会计算正确的值,因为它始终默认为反余弦的默认值。

这是代码:

import cv2
import numpy as np
def RGB_TO_HSI(img):
with np.errstate(divide='ignore', invalid='ignore'):
bgr = cv2.split(img)
intensity = np.divide(bgr[0] + bgr[1] + bgr[2], 3)
saturation = 1 - 3 * np.divide(np.minimum(bgr[2], bgr[1], bgr[0]), bgr[2] + bgr[1] + bgr[0])
def calc_hue(bgr):
blue = bgr[0]
green = bgr[1]
sqrt_calc = np.sqrt(((bgr[2] - bgr[1]) * (bgr[2] - bgr[1])) + ((bgr[2] - bgr[0]) * (bgr[1] - bgr[0])))
if green.any >= blue.any:
hue = np.arccos(1/2 * ((bgr[2]-bgr[1]) + (bgr[2] - bgr[0])) / sqrt_calc)
else:
hue = 360 - np.arccos(1/2 * ((bgr[2]-bgr[1]) + (bgr[2] - bgr[0])) / sqrt_calc)
hue = np.int8(hue)
return hue
hue = calc_hue(bgr)
hsi = cv2.merge((intensity, saturation, calc_hue(bgr)))

这是我用于转换的公式

提前感谢您的任何提示或想法

好的,这里发生了很多事情。我必须这么说,我知道你是新手,但在你发布问题之前检查文档,否则你最终会错误地使用库。(即np.minimum()不会一次比较 3 个值(。

注意变量类型。您的代码使用np.uint8进行操作,就好像它们在np.int32.始终尝试与变量类型保持一致。

说得够多了,在不对代码进行太多更改的情况下,我想出了:

import cv2
import numpy as np
from math import pi
def BGR_TO_HSI(img):
with np.errstate(divide='ignore', invalid='ignore'):
bgr = np.int32(cv2.split(img))
blue = bgr[0]
green = bgr[1]
red = bgr[2]
intensity = np.divide(blue + green + red, 3)
minimum = np.minimum(np.minimum(red, green), blue)
saturation = 1 - 3 * np.divide(minimum, red + green + blue)
sqrt_calc = np.sqrt(((red - green) * (red - green)) + ((red - blue) * (green - blue)))
if (green >= blue).any():
hue = np.arccos((1/2 * ((red-green) + (red - blue)) / sqrt_calc))
else:
hue = 2*pi - np.arccos((1/2 * ((red-green) + (red - blue)) / sqrt_calc))
hue = hue*180/pi
hsi = cv2.merge((hue, saturation, intensity))
return hsi

我希望它有所帮助

最新更新