【发布时间】:2018-07-04 00:15:19
【问题描述】:
首先,我意识到现有的关于将 RGB 图像转换为 HSV 图像的问题;我使用其中一个问题来帮助我编写代码。但是,我得到的 HSV 值对我来说没有意义。
我从this website 获得的有关 HSV 的信息。从this colorpicker,我推断出H是0-360度范围内的数字,S是0-100%范围内的数字,V是0-100%范围内的数字。因此,我假设我的代码(如下)将返回一个介于 0 和 360 之间的 H 值,以及介于 0 和 100 之间的 S/V 值。但是,事实并非如此。
我将程序的输出插入到上面的颜色选择器中,当所有 S/V 值超过 100 时,它们会下降到 100。如您所见,输出 接近 应该是什么,但不准确。我觉得这是因为我错误地解释了 HSV 值。
对于contex,我将为立方体上的每种颜色建立一个范围,然后从那里查看其他面并在我拥有的另一个程序中填写立方体的当前设置。
我的代码:
void get_color(Mat img, int x_offset, int y_offset)
{
Rect outline(x_offset - 2, y_offset - 2, 5, 5);
rectangle(img, outline, Scalar(255, 0, 0), 2);
Rect sample(x_offset, y_offset, 1, 1);
Mat rgb_image = img(sample);
Mat hsv_image;
cvtColor(rgb_image, hsv_image, CV_BGR2HSV);
Vec3b hsv = hsv_image.at<Vec3b>(0, 0);
int hue = hsv.val[0];
int saturation = hsv.val[1];
int value = hsv.val[2];
printf("H: %d, S: %d, V: %d \n", hue, saturation, value);
}
程序的输出:
H: 21, S: 120, V: 191 // top left cubie
H: 1, S: 180, V: 159 // top center cubie
H: 150, S: 2, V: 142 // top right cubie
H: 86, S: 11, V: 159 // middle left cubie
H: 75, S: 12, V: 133 // middle center cubie
H: 5, S: 182, V: 233 // middle right cubie
H: 68, S: 7, V: 156 // bottom left cubie
H: 25, S: 102, V: 137 // bottom center cubie
H: 107, S: 155, V: 69 // bottom right cubie
起始图像(在每个蓝色方块的中心提取像素):
产生的颜色(如上面的颜色选择器给出的):
如您所见,红色和白色相当准确,但橙色和黄色不正确,蓝色明显错误;我看到的像素不可能是那种颜色。我究竟做错了什么?任何帮助将不胜感激。
【问题讨论】:
-
无符号字节 (Vec3b) 不能表示 0 到 360 之间的值,这就是为什么 openCV 将色调分辨率降低一半并默认使用 0 到 180 的值 S 和 V 通道为 0..255 .有一个特殊标志在色调通道上使用 0..255,从 0..360 缩放(比 0..180 分辨率更高),但默认值为 0..180