带佬资源链接基于IHS变换和小波变换的可见光和红外图像融合(opencv/C++实现)
1)运行环境:WIN10 + VS2017社区 + opencv3.2.0
2)基于C++实现
大佬的程序给的很清楚,剩下的边角料工作来整理一下。
主要就是头文件、声明以及一些自己运行时报错的调试。
- 头文件及声明
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
//这里用了math.h但是没什么用,所以对pi直接定义
#define PI 3.14159265358979323846 // pi
using namespace cv;
using namespace std;
除头文件和声明外,还会报一个
PI
未定义的错,即使用了math.h
也没用(对我来说),索性直接定义一下派
- 报错调试
将下面2个函数中的部分内容进行修改,直接贴修改后的程序了。
Mat WaveTransform::waveletDecompose(const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter)
Mat WaveTransform::waveletReconstruct(const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter)
主要是报
无法从“cv::Mat_<float>”转换为“cv::Mat &”
的错误,通了一下程序,发现是子函数中将Mat
直接赋给Mat &
(可能表述不是很正确),反正修改一下就好了。
Mat WaveTransform::waveletDecompose(const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter)
{
assert(_src.rows == 1 && _lowFilter.rows == 1 && _highFilter.rows == 1);
assert(_src.cols >= _lowFilter.cols && _src.cols >= _highFilter.cols);
//Mat &src = Mat_<float> (_src);
Mat src = Mat_<float>(_src);
int D = src.cols;
//Mat &lowFilter = Mat_<float>(_lowFilter);
//Mat &highFilter = Mat_<float>(_highFilter);
Mat lowFilter = Mat_<float>(_lowFilter);
Mat highFilter = Mat_<float>(_highFilter);
//频域滤波或时域卷积;ifft( fft(x) * fft(filter)) = cov(x,filter)
Mat dst1 = Mat::zeros(1, D, src.type());
Mat dst2 = Mat::zeros(1, D, src.type());
filter2D(src, dst1, -1, lowFilter);
filter2D(src, dst2, -1, highFilter);
//下采样
//数据拼接
for (int i = 0, j = 1; i < D / 2; i++, j += 2)
{
src.at<float>(0, i) = dst1.at<float>(0, j);//lowFilter
src.at<float>(0, i + D / 2) = dst2.at<float>(0, j);//highFilter
}
return src;
}
Mat WaveTransform::waveletReconstruct(const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter)
{
assert(_src.rows == 1 && _lowFilter.rows == 1 && _highFilter.rows == 1);
assert(_src.cols >= _lowFilter.cols && _src.cols >= _highFilter.cols);
//Mat &src = Mat_<float>(_src);
Mat src = Mat_<float>(_src);
int D = src.cols;
//Mat &lowFilter = Mat_<float>(_lowFilter);
//Mat &highFilter = Mat_<float>(_highFilter);
Mat lowFilter = Mat_<float>(_lowFilter);
Mat highFilter = Mat_<float>(_highFilter);
/// 插值;
Mat Up1 = Mat::zeros(1, D, src.type());
Mat Up2 = Mat::zeros(1, D, src.type());
for (int i = 0, cnt = 0; i < D / 2; i++, cnt += 2)
{
Up1.at<float>(0, cnt) = src.at<float>(0, i); ///< 前一半
Up2.at<float>(0, cnt) = src.at<float>(0, i + D / 2); ///< 后一半
}
/// 前一半低通,后一半高通
Mat dst1 = Mat::zeros(1, D, src.type());
Mat dst2 = Mat::zeros(1, D, src.type());
filter2D(Up1, dst1, -1, lowFilter);
filter2D(Up2, dst2, -1, highFilter);
/// 结果相加
dst1 = dst1 + dst2;
return dst1;
}
至于一些warning,emmmm,我的强迫症还好。