在vs2022的环境下使用C++语言编写一段代码,通过HSI转RGB的方法,进行遥感多光谱影像与全色影像的融合,要求输入多光谱影像、全色影像,输出融合影像
时间: 2024-03-25 14:41:21 浏览: 16
好的,以下是使用C++语言编写的遥感多光谱影像与全色影像融合的示例代码:
```c++
#include <iostream>
#include <cmath>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
// 定义常量PI
const double PI = 3.14159265358979323846;
// 定义HSI转RGB的函数
void HSI2RGB(double H, double S, double I, double &R, double &G, double &B)
{
// 计算色调角度
double alpha = H * 2 * PI / 360.0;
// 计算RGB的值
if (alpha >= 0 && alpha < 2 * PI / 3) {
B = I * (1 - S);
R = I * (1 + S * cos(alpha) / cos(PI / 3 - alpha));
G = 3 * I - (R + B);
} else if (alpha >= 2 * PI / 3 && alpha < 4 * PI / 3) {
alpha = alpha - 2 * PI / 3;
R = I * (1 - S);
G = I * (1 + S * cos(alpha) / cos(PI / 3 - alpha));
B = 3 * I - (R + G);
} else {
alpha = alpha - 4 * PI / 3;
G = I * (1 - S);
B = I * (1 + S * cos(alpha) / cos(PI / 3 - alpha));
R = 3 * I - (G + B);
}
}
int main()
{
// 加载多光谱影像和全色影像
Mat multispectral_img = imread("multispectral.jpg", IMREAD_UNCHANGED);
Mat panchromatic_img = imread("panchromatic.jpg", IMREAD_UNCHANGED);
// 检查图像是否加载成功
if (multispectral_img.empty() || panchromatic_img.empty()) {
cout << "Failed to load image(s)." << endl;
return -1;
}
// 将多光谱影像转换为HSI颜色空间
Mat hsi_img;
cvtColor(multispectral_img, hsi_img, COLOR_BGR2HSV);
// 分离HSI颜色空间的三个通道
vector<Mat> channels;
split(hsi_img, channels);
Mat H = channels[0];
Mat S = channels[1];
Mat I = channels[2];
// 将全色影像转换为灰度图像
Mat panchromatic_gray;
cvtColor(panchromatic_img, panchromatic_gray, COLOR_BGR2GRAY);
// 定义融合后的RGB图像
Mat fusion_img(multispectral_img.size(), CV_8UC3);
// 遍历每个像素点,进行融合
for (int i = 0; i < multispectral_img.rows; i++) {
for (int j = 0; j < multispectral_img.cols; j++) {
// 获取HSI的三个通道和全色影像的灰度值
double h = H.at<uchar>(i, j) * 2; // 色调范围为0~360度
double s = S.at<uchar>(i, j) / 255.0;
double ii = I.at<uchar>(i, j) / 255.0;
double p = panchromatic_gray.at<uchar>(i, j);
// 将HSI转换为RGB
double r, g, b;
HSI2RGB(h, s, ii, r, g, b);
// 将全色影像的灰度值与RGB通道融合
r = sqrt(p / 255.0) * r;
g = sqrt(p / 255.0) * g;
b = sqrt(p / 255.0) * b;
// 将融合后的RGB值写入输出图像
Vec3b &pixel = fusion_img.at<Vec3b>(i, j);
pixel[0] = saturate_cast<uchar>(b * 255.0);
pixel[1] = saturate_cast<uchar>(g * 255.0);
pixel[2] = saturate_cast<uchar>(r * 255.0);
}
}
// 显示输出图像
imshow("Fusion Image", fusion_img);
waitKey(0);
return 0;
}
```
在此代码中,我们首先通过OpenCV库加载了多光谱影像和全色影像,并将多光谱影像转换为HSI颜色空间。然后,我们遍历了每个像素点,获取了HSI的三个通道和全色影像的灰度值,并使用HSI2RGB函数将HSI颜色空间转换为RGB颜色空间。最后,我们将全色影像的灰度值与RGB三个通道进行融合,将融合后的RGB值写入输出图像。
需要注意的是,由于OpenCV中的颜色通道顺序为BGR,而不是RGB,因此在写入输出图像时,需要按照BGR的顺序写入。另外,由于上述代码中使用了一些OpenCV函数,因此需要在编译时链接OpenCV库。