#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))
Используемые версии:
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
.