首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自制bgr2hsv与opencv bgr2hsv的不同结果

自制bgr2hsv与opencv bgr2hsv的不同结果
EN

Stack Overflow用户
提问于 2017-07-20 06:04:20
回答 1查看 739关注 0票数 1

我通过使用OpenCV,C++访问像素来实现OpenCV函数。我刚在互联网上用bgr2hsv算法对它进行了编码。我把我的bgr2hsv()cvtColor()结果做了比较。

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

代码语言:javascript
复制
//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);

结果出来了。在这里输入图像描述

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-20 07:31:57

我不会建议从互联网上抓取一些东西,并期望它能给你正确的结果,除非你了解发生了什么。为什么不直接使用OpenCV文档中的公式

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45206400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档