如何在c ++中使用RGBtoHSV转换器功能后显示HSV图像?

时间:2015-01-05 23:38:34

标签: c++ opencv hsv

晚上好,在网上我们可以找到很多将RGB像素值转换为HSV的算法,但我找不到显示它的功能。我正在使用MS Visual Studio 2013和openCV库。我知道有建立函数来获取HSV图像: cvtColor(obrazeczek1,obrazeczek1,CV_BGR2HSV); 但我尝试在没有此功能的情况下执行此操作。例如,为了获得灰色图像我使用函数:

#define NORMALIZE_RGB(x) \
    (x > 255 ? 255 : (x < 0 ? 0 : x))

cv::Mat rgb2grey(cv::Mat& I)
{
CV_Assert(I.depth() != sizeof(uchar));
cv::Mat  res(I.rows, I.cols, CV_8UC3);
switch (I.channels())  {
case 3:
    cv::Mat_<cv::Vec3b> _I = I;
    cv::Mat_<cv::Vec3b> _R = res;

    for (int i = 0; i < I.rows; ++i)
        for (int j = 0; j < I.cols; ++j){

        int grey = ((_I(i, j)[0]) + (_I(i, j)[1]) + (_I(i, j)[2])) / 3;

            _I(i, j)[0] = NORMALIZE_RGB(grey);
            _I(i, j)[1] = NORMALIZE_RGB(grey);
            _I(i, j)[2] = NORMALIZE_RGB(grey);
        }

    res = _I;
    break;
}
return res;
}

并调用功能和显示图像:

cv::Mat image = cv::imread("name.jpg");
cv::Mat img = rgb2grey(image);
cv::imshow("Grey image", img);

我在这里找到Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both提示。我知道如何将RGB像素转换为HSV,但如何使用 imshow 显示此矩阵?我也发现函数rgb2hsv但我不知道要改变什么,显示它。这是一个功能:

void rgb2hsv(double r, double g, double b, double &h, double &s, double &v)
{
v = max(max(r, g), b);
double t = min(min(r, g), b);
double delta = v - t;
if (v != 0.0)
    s = delta / v;
else
    s = 0.0;
if (s == 0.0)
    h = 0.0;
else
{
    if (r == v)
        h = (g - b) / delta;
    else
        if (g == v)
            h = 2.0 + (b - r) / delta;
        else
            if (b == v)
                h = 4.0 + (r - g) / delta;
    h = h * 60.0;
    if (h < 0.0)
        h += 360;
}
}

这里没有类似的问题,所以请求帮助。

2 个答案:

答案 0 :(得分:3)

使用imshow()显示已转换为HSV的图像没有意义。

imshow()认为,Matrix处于BGR顺序。将图像转换为HSV只会将RGB值转换为HSV通道值。

在3频道之前,转换后它也是3频道但其他值。 imshow()仍希望将图像显示为RGB图像,然后使用导致图像无效的HSV值。

只需将其转换回RGB即可使imshow()正确显示图像。

修改

Mat hsv, bgr; // hsv is the hsv image you want to display
cvtColor(hsv, bgr, CV_HSV2BGR);
imshow("lolz", bgr);

答案 1 :(得分:0)

您对色彩空间转换有误解。您可能希望图像在进行色彩空间转换时在外观上看起来有所不同,但没有。

图像仍将包含相同的信息,只是格式不同。就像您以.jpg.png等形式存储图像文件时一样。它们仍然是同一图像。您无需从jpg转换为png并再次查看它,因为您知道它看起来会一样。二进制内容将有所不同,但语义内容将完全相同。

HSV,BGR,RGB,LAB只是同一图像的不同表示。无论您使用什么颜色空间,图像都将看起来相同。 OpenCV期望imshow()将使用BGR颜色空间,因此您需要在显示之前将任何图像转换为BGR

您已经拥有BGR图像,因此无需将其转换为HSV即可显示它。

唯一一次真正更改图像的时间是将其转换为灰度图像。那是当您丢失一些信息,并且图像看起来会有所不同。

如果您使用imshow()显示HSV图像,它将显示一个无效的图像,您可能认为该图像有用或很酷。但事实并非如此。就像您认为它是一个漂亮的bug一样。

因此,仅显示BGR图片,它的语义内容与HSV相同。