我试图模仿在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
任何有关我出错的地方的帮助都会很感激。谢谢!
答案 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]色调范围。