halcon视觉专栏OpenCv

从RGB空间转换到HSV空间

2019-12-05  本文已影响0人  coolTigers

最近接到一个任务,将halcon代码改写成opencv代码。
在改写时,遇到一个RGB颜色空间转换到HSV颜色空间的问题。转换语句很简单:
cvtColor(src, dst, COLOR_BGR2HSV)
转换后需要对Hue通道的值进行门限值判断,halcon代码中Hue门限值区间是[300,350]。因为8bit图的上限是255,已经超出了360度,所以我就去opencv官网文档查了一下这个函数。

image.png
其中Hue值,我一开始理解的是Hue值取一半,然后归一化到[0,255]区间内(fit to 0 to 255)。在调试这段程序的时候,始终没有发现大于300的像素,统计一下最大值也才只有170多。
遂决定写几条语句验证一下转换公式:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    Mat blue(1, 1, CV_8UC3, Scalar(255, 0, 0));
    Mat green(1, 1, CV_8UC3, Scalar(0, 255, 0));
    Mat red(1, 1, CV_8UC3, Scalar(0, 0, 255));
    
    Mat hsvOfBlue, hsvOfGreen, hsvOfRed;
    cvtColor(blue, hsvOfBlue, COLOR_BGR2HSV);
    cvtColor(green, hsvOfGreen, COLOR_BGR2HSV);
    cvtColor(red, hsvOfRed, COLOR_BGR2HSV);
    cout << "After convertion, hue of blue is \n" << hsvOfBlue << endl;
    cout << "After convertion, hue of green is \n" << hsvOfGreen << endl;
    cout << "After convertion, hue of red is \n" << hsvOfRed << endl;

    waitKey(0);
    return 0;
}

运行结果如下:


image.png

从运行结果可以看出,转换后Hue的值只是取了理论值(蓝色240°,绿色120°,红色0°)的二分之一,并没有归一化到[0,255]。我又回去读那句话:to fit to 0 to 255。这时候才明白,原来取理论值的二分之一的目的是为了适配[0,255]的区间。所以在改写halcon代码中判断Hue门限值的时候,门限值同样也要乘以二分之一。同时也可以发现saturation和value已经被归一化到[0,255]范围内了。

上一篇 下一篇

猜你喜欢

热点阅读