自制bgr2hsv和opencv bgr2hsv结果不同

Different results between self-made bgr2hsv and opencv bgr2hsv

我通过使用 OpenCV、C++ 访问像素来实现 bgr2hsv 函数。 我只是在网上用bgr2hsv算法编码的。 我将 bgr2hsv()cvtColor() 结果进行了比较。

实际上,即使原始图像相同,结果图像的颜色也略有不同。我试图找出为什么不同,但找不到。 你能看到源代码和结果图像吗? 这是代码。

//self-made bgr2hsv
double b, g, r;
double bb, gg, rr;
double tmax, tmin;
double h = 0, s = 0, v = 0;
double del, delB, delG, delR;

Mat image = imread("lena.jpg", 1);
Mat clone1 = image.clone();
Mat img;
image.convertTo(img, CV_64F);

for (int y = 0; y < img.rows; y++)
{
    for (int x = 0; x < img.cols; x++)
    {
        b = image.at<Vec3b>(y, x)[0];
        g = image.at<Vec3b>(y, x)[1];
        r = image.at<Vec3b>(y, x)[2];

        bb = b / 255;
        gg = g / 255;
        rr = r / 255;

        tmax = _max(bb, gg, rr);
        tmin = _min(bb, gg, rr);

        v = tmax;
        del = tmax - tmin;
        if (del == 0) {
            h = 0;
            s = 0;
        }
        else {
            s = del / tmax;
            delB = ((tmax - b) / 6 + del / 2) / del;
            delG = ((tmax - g) / 6 + del / 2) / del;
            delR = ((tmax - r) / 6 + del / 2) / del;

            if (b == tmax) {
                h = (2 / 3) + delG - delR;
            }
            if (g == tmax) {
                h = (1 / 3) + delR - delB;
            }
            if (r == tmax) {
                h = delB - delG;
            }
            if (h < 0) h += 1;
            if (h > 1) h -= 1;
        }
        img.at<Vec3d>(y, x)[0] = h;
        img.at<Vec3d>(y, x)[1] = s;
        img.at<Vec3d>(y, x)[2] = v;
    }
}
//bgr2hsv with cvtColor
cvtColor(image,clone1,CV_BGR2HSV);

imwrite("implemented_hsv.jpg",clone1);
imwrite("bgr2hsv.jpg", img);

//show images
imshow("bgr2hsv", img);
imshow("implemented_hsv",clone1);
waitKey(0);

结果在这里。 enter image description here

我不建议从互联网上抓取一些东西并期望它能给你正确的结果,除非你明白发生了什么。不用这个,为什么不直接用 the formula from the OpenCV docs?

有关此特定转换的示例,请参阅我的回答 。它使用 OpenCV 在上面链接的文档中提到的用于 BGR 到 HSV 转换的确切公式。它在 Python 而不是 C++ 中,但是 Python 无论如何都相当容易阅读。