将一张照片的低频和另一种照片的高频叠加成一张新的图片。
注意:两张图片要格式一致,大小一致。
代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void displayMagnitudeSpectrum(const Mat& complexImage) {
Mat magnitude;
magnitude = Mat(complexImage.size(), CV_32F);
// 计算频谱幅度
magnitude = Mat::zeros(complexImage.size(), CV_32F);
for (int i = 0; i < complexImage.rows; i++) {
for (int j = 0; j < complexImage.cols; j++) {
magnitude.at<float>(i, j) = sqrt(pow(complexImage.at<Vec2f>(i, j)[0], 2) + pow(complexImage.at<Vec2f>(i, j)[1], 2));
}
}
// 对数变换,增强显示效果
magnitude += Scalar::all(1);
log(magnitude, magnitude);
normalize(magnitude, magnitude, 0, 1, NORM_MINMAX);
// 将频谱图像转换为灰度图像
Mat magnitudeImage;
magnitude.convertTo(magnitudeImage, CV_8UC1, 255);
// 显示频谱图像
imshow("Magnitude Spectrum", magnitudeImage);
}
int main()
{
// 读取两张图片
Mat image1 = imread("D:/C++/jcw_2.png", IMREAD_GRAYSCALE);
Mat image2 = imread("D:/C++/pyy_2.png", IMREAD_GRAYSCALE);
if (image1.empty() || image2.empty()) {
cout << "Error: Could not load images." << endl;
return -1;
}
// 创建高斯滤波器以提取低频信息
Mat lowPassImage;
GaussianBlur(image1, lowPassImage, Size(15, 15), 0);
// 创建拉普拉斯滤波器以提取高频信息
Mat highPassImage;
Laplacian(image2, highPassImage, CV_16S, 3);
convertScaleAbs(highPassImage, highPassImage);
// 结合低频和高频信息
Mat combinedImage = lowPassImage + highPassImage;
// 保存结果图片
imwrite("combined_image.png", combinedImage);
// 显示结果
imshow("Low Pass Image", lowPassImage);
imshow("High Pass Image", highPassImage);
imshow("Combined Image", combinedImage);
waitKey(0);
return 0;
}
效果:不太理想,因为彭于晏不是正脸。