在numpy数组中,HSV值是否以VSH的形式存储?

3

由于RGB存储为BGR,那么HSV的情况也是如此吗?

我正在制作一个项目,从网络摄像头中输入并将其转换为HSV颜色,以跟踪特定颜色的对象。


2
我认为我们需要更多的上下文。RGB 何时被存储为 BGR? - Warren Weckesser
BGR只是反映了在遥感中常用的波长从短到长的排序。哪个是正确的?这取决于你的学科,使用是控制因素。 - user1121588
不,顺序是hsv。请注意数据范围,h [0,179],s和v [0,255]。 - Miki
@Aditya:请问您能进一步描述您的问题吗?您是加载了普通图像并将其转换为HSV,还是使用OpenCv将图像保存为HSV格式并保存到磁盘中。 - saurabheights
@saurabheights 我正在将普通图像转换为HSV格式。 - Aditya srivastava
@Adityasrivastava:请看下面我的答案。希望能有所帮助。 - saurabheights
2个回答

2
不是,这是HSV模式。
阅读下面的代码并在示例图像上运行。
int main()
{
    // Load your Red colored image
    cv::Mat frame = imread("test.png");

    // Split each channel
    cv::Mat rgbChannels[3];
    cv::split(frame, rgbChannels);
    cv::imshow("RGB", frame);

    // Check value of your Red, Blue and Green Channel
    double minVal, maxVal;
    // Note: Blue is first channel
    cv::minMaxLoc(rgbChannels[0], &minVal, &maxVal);
    std::cout << "Blue: Min = " << minVal << ", Max = " << maxVal << std::endl;
    cv::minMaxLoc(rgbChannels[1], &minVal, &maxVal);
    std::cout << "Green: Min = " << minVal << ", Max = " << maxVal << std::endl;
    cv::minMaxLoc(rgbChannels[2], &minVal, &maxVal);
    std::cout << "Red: Min = " << minVal << ", Max = " << maxVal << std::endl;

    std::cout << "*******************************" << std::endl;

    cv::Mat hsv;
    cv::Mat hsvChannels[3];
    // Convert BGR image to HSV. Dont use CV_RGB2HSV.
    cv::cvtColor(frame, hsv, CV_BGR2HSV);

    // Split each channel
    cv::split(hsv, hsvChannels);

    // **Display HSV image: Note: When displaying opencv does not display image as Red image**
    // This is because imshow will just take first channel which is hue and treat it as Blue, second channel as 
    // Green, and last channel as Red.
    cv::imshow("HSV", hsv);
    cv::minMaxLoc(hsvChannels[0], &minVal, &maxVal);
    std::cout << "Hue: Min = " << minVal << ", Max = " << maxVal << std::endl;
    cv::minMaxLoc(hsvChannels[1], &minVal, &maxVal);
    std::cout << "Saturation: Min = " << minVal << ", Max = " << maxVal << std::endl;
    cv::minMaxLoc(hsvChannels[2], &minVal, &maxVal);
    std::cout << "Value: Min = " << minVal << ", Max = " << maxVal << std::endl;
    waitKey(0);
    return 0;
}

红色图片

输出:-

Blue: Min = 36, Max = 36
Green: Min = 28, Max = 28
Red: Min = 237, Max = 237
*******************************
Hue: Min = 179, Max = 179
Saturation: Min = 225, Max = 225
Value: Min = 237, Max = 237
输出解释 使用这个工具,RGB值(237, 28, 36)映射到HSV(358,88.2,92.9)。由于色调范围从0到359,该值超过了1字节的边界,只允许256个值。色调除以2后,范围为[0,179],以在opencv中使用更少的内存。色调值358除以2映射到179,是第一个通道。此外,饱和度和值仅被归一化为0-255的比例。因此,如您所见,饱和度映射到第二个通道,值映射到第三个通道。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接