Matplotlib цвета rgb_to_hsv: v-значение от 0 до 255 при использовании изображения OpenCV

#python #opencv #matplotlib #hsv

Вопрос:

Описания цветовой карты HSV, которые я нахожу, описывают значения в диапазоне [0-360,0-1,0-1] или [0-1, 0-1, 0-1].
Затем с помощью функции matplotlib matplotlib.colors.rgb_to_hsv() с изображением, открытым OpenCV, значения варьируются в диапазоне [0-1, 0-1, 0-255].
При обратном преобразовании изображения из hsv в rgb два изображения выглядят одинаково, поэтому преобразование, похоже, работает, с техническим сайтом проблем нет.

Но я хочу понять, почему значение v находится в диапазоне от 0 до 255?

Используемый код:

 import matplotlib.pyplot as plt import matplotlib.colors as colors import numpy as np import cv2  img = cv2.imread("test_picture.png") img_hsv = colors.rgb_to_hsv(img) img_h, img_s, img_v = img_hsv[:, :, 0], img_hsv[:, :, 1], img_hsv[:, :, 2] img_new = colors.hsv_to_rgb(img_hsv).astype(np.uint8)  print("min h: ",np.min(img_h)) print("max h: ", np.max(img_h))  print("min s: ", np.min(img_s)) print("max s: ", np.max(img_s))  print("min v: ", np.min(img_v)) print("max v: ", np.max(img_v))  

Вывод значений HSV:
введите описание изображения здесь

Используемые версии:
Matplotlib: 3.3.4
Numpy: 1.18.1
OpenCV: 4.5.1

Комментарии:

1. В стороне: вы, скорее всего, запутаетесь, если смешаете OpenCV с matplotlib подобным. OpenCV использует упорядочение каналов BGR, matplotlib использует RGB. Поэтому вам нужно img_hsv = colors.rgb_to_hsv(img[...,::-1]) будет отменить заказ. OpenCV также использует различные диапазоны для HSV в зависимости от dtype изображения, например, оттенок находится в диапазоне 0..360 для float изображений, но в диапазоне 0..180 для uint8 .