使用OpenCV 2.4模仿Gimp的色调调整滑块

时间:2014-06-12 04:42:01

标签: opencv

我试图模仿在GIMP中看到的效果,它使用OpenCV调整图像的色调。有关Gimp选项的详细信息,请参阅此链接:http://docs.gimp.org/en/gimp-tool-hue-saturation.html,在调整所选滑块标题下:

  

Hue:滑块和输入框允许您选择色环中的色调(-180,180)。

滑块默认为0(图像显示没有变化),+180的变化与-180的变化相同(对于我看过的图像,大概是全部)。所以我认为正在发生的是Gimp将每个像素的色调值调整为模数360的选定量。

我一直试图在OpenCV中重现这种效果,但我没有太多运气。这是我的代码:

Mat img = imread("lena.jpg", CV_LOAD_IMAGE_COLOR);
Mat imgHSV;
cvtColor(img, imgHSV, CV_BGR2HSV);

for (int i = 0; i < imgHSV.rows; i++) {
    for (int j = 0; j < imgHSV.cols; j++) {
        imgHSV.at<Vec3b>(i, j)[0] = ((imgHSV.at<Vec3b>(i, j)[0] + 180) % 360;
    }
}

cvtColor(imgHSV, img, CV_HSV2BGR);

namedWindow("Hue Test", CV_WINDOW_AUTOSIZE);
imshow("Hue Test", img);

值得注意的是,我尝试了以下内容并获得了相同的结果:

imgHSV.at<Vec3b>(i, j)[0] += 180;    

您可以在此处查看结果:http://imgur.com/keBIQBV

您可以在GIMP中看到所需的结果:http://imgur.com/uev2WZw

任何有关我出错的地方的帮助都会很感激。谢谢!

1 个答案:

答案 0 :(得分:0)

OpenCV the Hue range is [0,360]。当像素具有深度CV_8U时,如在您的情况下,Hue值是“H <-H / 2”,因此在[0,180]的范围内。

因此,假设您的滑块值s介于[0,180]之间,则每个像素色调h将调整为h = (h+s)%180

  

Note: CV_BGR2HSV_FULL等未记录的转化代码,与CV_BGR2HSV类似,但使用映射H <- H*255/360代替输出图像为8位时H <- H/2。这有效地使输出色调范围[0,255]而不是[0,180];两者都从[0,360]压缩到一个字节。另一种选择是使用32位浮点输出,在这种情况下,您将得到整个[0,360]色调范围。