0%

C++ OpenCV 实现基于HLS(HIS)变换的图像融合

  1. 数据准备
  2. 代码

数据准备

有两张影像,一张全色、一张多光谱,已进行配准且大小一致。

image-20220103202642177

image-20220103202658716

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <opencv2/opencv.hpp>

/*
* 基于HLS(HIS)变换的图像融合
*/
int main()
{
using namespace cv;

// 读取全色影响(灰度)和多光谱影像(BGR彩色)
Mat pImg = imread("../ik_beijing_p.bmp", IMREAD_GRAYSCALE);
Mat cImg = imread("../ik_beijing_c.bmp", IMREAD_COLOR);

// 转为32位浮点型(色相H的范围是0-360)
Mat pfImg;
Mat cfImg;
pImg.convertTo(pfImg, CV_32FC1);
cImg.convertTo(cfImg, CV_32FC3);

// 将多光谱影像BGR转为HLS
Mat cHls;
cvtColor(cfImg, cHls, COLOR_BGR2HLS);

// 波段分割
std::vector<Mat> hls;
split(cHls, hls);

// 将第二波段(L)替换为全色影像
pfImg.copyTo(hls.at(1));

// 合并波段
merge(hls, cHls);

// HLS转为BGR浮点型
cvtColor(cHls, cfImg, COLOR_HLS2BGR);

// float 转为 unsigned char
cfImg.convertTo(cImg, CV_8UC3);

// 显示
imshow("img", cImg);
waitKey(0);

return 0;
}

融合后的结果:

image-20220103202822453