c++根据hsi图像编程实现色彩增强
时间: 2023-08-03 11:07:20 浏览: 99
色彩增强可以通过对HSI图像的S和I分量进行调整来实现。具体实现步骤如下:
1. 将RGB图像转换为HSI图像。
2. 对HSI图像进行分离,得到H、S、I三个分量。
3. 对S分量进行增强,可以通过调整其亮度来实现。可以使用以下公式:
S' = S * k
其中k是增强系数,可以根据实际需求进行调整。
4. 对I分量进行增强,可以通过调整其对比度来实现。可以使用以下公式:
I' = a * I + b
其中a是对比度系数,b是亮度调整系数,可以根据实际需求进行调整。
5. 将处理后的H、S、I三个分量合并为一个HSI图像。
6. 将HSI图像转换回RGB图像。
下面是一份C++代码示例:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// HSI色彩空间的转换公式
void RGB2HSI(Mat& src, Mat& dst)
{
int rows = src.rows;
int cols = src.cols;
dst.create(rows, cols, CV_32FC3);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
Vec3b bgr = src.at<Vec3b>(i, j);
float B = bgr[0] / 255.0;
float G = bgr[1] / 255.0;
float R = bgr[2] / 255.0;
float H, S, I;
float num = 0.5 * ((R - G) + (R - B));
float den = sqrt((R - G) * (R - G) + (R - B) * (G - B));
float theta = acos(num / den);
if (B <= G) {
H = theta;
}
else {
H = 2 * CV_PI - theta;
}
float min_val = min(min(R, G), B);
S = 1 - 3 * min_val / (R + G + B);
I = (R + G + B) / 3.0;
dst.at<Vec3f>(i, j)[0] = H;
dst.at<Vec3f>(i, j)[1] = S;
dst.at<Vec3f>(i, j)[2] = I;
}
}
}
// HSI色彩空间的逆转换公式
void HSI2RGB(Mat& src, Mat& dst)
{
int rows = src.rows;
int cols = src.cols;
dst.create(rows, cols, CV_8UC3);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
float H = src.at<Vec3f>(i, j)[0];
float S = src.at<Vec3f>(i, j)[1];
float I = src.at<Vec3f>(i, j)[2];
float B, G, R;
if (H < 2 * CV_PI / 3) {
B = I * (1 - S);
R = I * (1 + S * cos(H) / cos(CV_PI / 3 - H));
G = 3 * I - (R + B);
}
else if (H < 4 * CV_PI / 3) {
H -= 2 * CV_PI / 3;
R = I * (1 - S);
G = I * (1 + S * cos(H) / cos(CV_PI / 3 - H));
B = 3 * I - (R + G);
}
else {
H -= 4 * CV_PI / 3;
G = I * (1 - S);
B = I * (1 + S * cos(H) / cos(CV_PI / 3 - H));
R = 3 * I - (G + B);
}
dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(B * 255.0);
dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(G * 255.0);
dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(R * 255.0);
}
}
}
// 对HSI图像的S分量进行增强
void enhanceS(Mat& src, Mat& dst, float k)
{
int rows = src.rows;
int cols = src.cols;
dst.create(rows, cols, CV_32FC3);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
float H = src.at<Vec3f>(i, j)[0];
float S = src.at<Vec3f>(i, j)[1];
float I = src.at<Vec3f>(i, j)[2];
S *= k;
dst.at<Vec3f>(i, j)[0] = H;
dst.at<Vec3f>(i, j)[1] = S;
dst.at<Vec3f>(i, j)[2] = I;
}
}
}
// 对HSI图像的I分量进行增强
void enhanceI(Mat& src, Mat& dst, float a, float b)
{
int rows = src.rows;
int cols = src.cols;
dst.create(rows, cols, CV_32FC3);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
float H = src.at<Vec3f>(i, j)[0];
float S = src.at<Vec3f>(i, j)[1];
float I = src.at<Vec3f>(i, j)[2];
I = a * I + b;
dst.at<Vec3f>(i, j)[0] = H;
dst.at<Vec3f>(i, j)[1] = S;
dst.at<Vec3f>(i, j)[2] = I;
}
}
}
int main()
{
Mat src = imread("test.jpg");
if (src.empty()) {
cout << "could not load image!" << endl;
return -1;
}
Mat hsi, enhanced;
RGB2HSI(src, hsi);
// 对S分量进行增强
enhanceS(hsi, enhanced, 1.5);
HSI2RGB(enhanced, enhanced);
imshow("enhanced S", enhanced);
// 对I分量进行增强
enhanceI(hsi, enhanced, 1.5, 50);
HSI2RGB(enhanced, enhanced);
imshow("enhanced I", enhanced);
waitKey(0);
return 0;
}
```
在代码中,我们先将RGB图像转换为HSI图像,然后对S分量和I分量分别进行增强。对于S分量的增强,我们简单地调整其亮度;对于I分量的增强,我们调整其对比度和亮度。最后将处理后的HSI图像转换回RGB图像,并显示出来。
阅读全文