一、概要
本文先给出色调、饱和度和亮度的定义,然后将其量化,利用空间解析几何推导出RGB色彩空间与HSI色彩空间的转换关系,并给出实现这一转换的代码,同时给出OpenCV的标准转换算法。
二、色调、饱和度及亮度的定义
三、RGB色彩空间与HSI色彩空间转换关系的推导
四、算法实现及分析
基于以上推导,利用C++实现RGB色彩空间到HSI色彩空间的转换。输入图像如下所示:
1、强度
利用本文推导的强度计算公式从RGB空间中提取图像的强度,代码如下所示:
#include<iostream>
#include<opencv2/opencv.hpp>
#include<math.h>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("RGB.jpg");
imshow("输入图像", src);
Mat I = Mat::zeros(src.size(), CV_32FC1);
for (int row = 0; row < src.rows; row++)
{
for (int col = 0; col < src.cols; col++)
{
I.at<float>(row, col) = (float)(src.at<Vec3b>(row, col)[0] + src.at<Vec3b>(row, col)[1] + src.at<Vec3b>(row, col)[2]) / 3;
}
}
I.convertTo(I, CV_8UC1);
imshow("强度(推导)", I);
waitKey(0);
system("pause");
return 0;
}
将上述代码的运行结果与利用OpenCV的API的运行结果进行对比,对比结果如下所示:
由于输出的是单通道图像,所以显示的效果为灰度图,但依然可以从对比结果中验证推导结果。上图中,左侧是利用OpenCV的API的运行结果,右侧是根据本文推导的强度算法的运行结果。显然,两种方法的运行结果基本一致。
2、饱和度
利用本文推导的饱和度计算公式从RGB空间中提取图像的饱和度,代码如下所示:
#include<iostream>
#include<opencv2/opencv.hpp>
#include<math.h>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("RGB.jpg");
imshow("输入图像", src);
Mat S = Mat::zeros(src.size(), CV_32FC1);
for (int row = 0; row < src.rows; row++)
{
for (int col = 0; col < src.cols; col++)
{
int B_2 = pow(src.at<Vec3b>(row, col)[0], 2);//B^2
int G_2 = pow(src.at<Vec3b>(row, col)[1], 2)