BGR转HSV
效果:
代码:
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
Mat dog = imread("/home/jason/work/01-img/dog.png");
// -----------------------------------------------------------------
// 转换成HSV色彩空间
Mat hsv;
cvtColor(dog, hsv, COLOR_BGR2HSV);
// 把3个通道分割进三幅图像中
std::vector<Mat> channels;
split(hsv,channels);
imshow("hue", channels[0]); // 色调, 主色
imshow("saturation", channels[1]); // 饱和度, 鲜艳程度
imshow("brightness", channels[2]); // 亮度,颜色亮度的近似值; 明暗
//--------------------------------------------------------------
//人为生成一幅图像,用来说明各种色调/饱和度组合
Mat hs(128, 360, CV_8UC3);
for (int h=0; h<360; h++){
for (int s=0; s<128; s++){
hs.at<Vec3b>(s, h)[0] = h/2; // 所有色调角度
// 饱和度从高到低
hs.at<Vec3b>(s, h)[1] = 255 - s*2;
hs.at<Vec3b>(s, h)[2] = 255; // 常数
}
}
imshow("hue/Saturation", hs);
// ---------------------------------------------------------
// 修改一幅图像,把它所有的像素都设置为一个固定的亮度,但不改变色调和饱和度
// 转换成HSV色彩空间
Mat changed;
cvtColor(dog, changed, COLOR_BGR2HSV);
// 将3个通道分割成3副图像
std::vector<Mat> images;
split(dog, images);
// 所有像素的颜色亮度将变成固定值
images[2]=255;
// 重新合并通道
merge(images, changed);
// 转换会BGR
Mat newImage;
cvtColor(changed, newImage, COLOR_HSV2BGR);
imshow("new", newImage);
waitKey(0);
return 0;
}