为什么 MATLAB 的 rgb2hsv 返回错误的色调值?

考虑下图:

http://img1.mukewang.com/62d65ea000017aae01470112.jpg

以下 MATLAB 代码返回色调值的直方图:


img1 = imread('img.png');  

img1(img1<1) = 0;

%

img_hsv = rgb2hsv(img1);

hue_img = img_hsv(:,:,1);

array = hue_img(hue_img > 0.1);

histfit(array, 20)

http://img4.mukewang.com/62d65eaa0001e90e03340211.jpg

它返回错误的 Hue 值,但 Python 中的等效代码返回正确的值。


import cv2 

import matplotlib.pyplot as plt

import numpy as np

from skimage import data

from skimage.color import rgb2hsv


img = cv2.imread(r"img.png") 

rgb_img = img 

hsv_img = rgb2hsv(rgb_img) 

hue_img = hsv_img[:, :, 0] 

hue_img[np.where(hue_img > 0.1)] 

array = hue_img[np.where(hue_img > 0.1)] 

plt.hist(array,bins=100)

http://img3.mukewang.com/62d65eb900014cb703710249.jpg

通过在任何图像编辑软件中使用颜色选择器工具,我们可以看到正确的色调值大约是 100 分中的 50 分或 1 分中的 0.5 分。

http://img3.mukewang.com/62d65ec60001ca9504900352.jpg

我们如何从 MATLAB 中获得正确的色调值rgb2hsv



holdtom
浏览 109回答 1
1回答

慕田峪4524236

这里有几个问题,会导致错误的结论。在所示(Photoshop?)屏幕截图中,色调值为51°,而不是51%。色相值范围从 0° 到 360°,参见。关于 HSV 颜色空间的Wikipedia 文章。因此,51°的色调值等于14.17%,这与所示的 MATLAB 直方图一致。所以,错的不是 MATLAB 代码,而是 Python 代码!OpenCV (&nbsp;cv2) 默认使用 BGR 颜色排序,因此对于img = cv2.imread(r"img.png"),我们img使用 BGR 颜色排序。现在,hsv_img = rgb2hsv(rgb_img)使用,其中skimage.color.rgb2hsv等待具有 RGB 颜色排序的图像,这会导致错误的 Python 结果。这是一个可能的解决方法(注意,您的图表显示bins=20):img = cv2.imread(r"img.png")rgb_img = img[:, :, [2, 1, 0]]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # BGR to RGBhsv_img = rgb2hsv(rgb_img)hue_img = hsv_img[:, :, 0]array = hue_img[np.where(hue_img > 0.1)]plt.hist(array,bins=20)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 20 instead of 100那将是更正的 Python 输出:我们看到,它与 MATLAB 输出相当。希望有帮助!编辑:或者,使用skimage.io.imread而不是cv2.imread.&nbsp;然后,不需要任何转换,因为skimage.io.imread默认使用 RGB 颜色排序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python