我用opencv写了一段关于金字塔融合算法的程序,目的是将苹果和橘子融合成一幅图片,但是现在运行出来的效果图像很暗,不知道哪里出了问题,希望得到解答,谢谢!
下面是我的代码:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat apple = imread("apple.png");
apple.convertTo(apple, CV_32F, 1.0 / 255.0);
Mat orange = imread("orange.png");
orange.convertTo(orange, CV_32F, 1.0 / 255.0);
Mat mask = imread("mask.png");
mask.convertTo(mask, CV_32F, 1.0 / 255.0);
int level = 5;
vector <Mat> apple_LaplacianPyramid;
vector <Mat> orange_LaplacianPyramid;
vector <Mat> GaussianPyramid_mask;
//做苹果的拉普拉斯金字塔
Mat apple1, apple2, apple3;
Mat Lap1;
apple.copyTo(apple1);
for (int i = 0; i<level; i++)
{
pyrDown(apple1, apple2);
pyrUp(apple2, apple3, apple1.size());
Lap1 = apple1 - apple3;
apple_LaplacianPyramid.push_back(Lap1);
apple1 = apple2;
}
//做橘子的拉普拉斯金字塔
Mat orange1, orange2, orange3;
Mat Lap2;
orange.copyTo(orange1);
for (int i = 0; i<level; i++)
{
pyrDown(orange1, orange2);
pyrUp(orange2, orange3, orange1.size());
Lap2 = orange1 - orange3;
orange_LaplacianPyramid.push_back(Lap2);
orange1 = orange2;
}
//求掩膜的高斯金字塔
Mat mask1, mask2;
mask.copyTo(mask1);
GaussianPyramid_mask.push_back(mask);
for (int i = 0; i<level - 1; i++)
{
pyrDown(mask1, mask2);
GaussianPyramid_mask.push_back(mask2);
mask1 = mask2;
}
//将每一层的图像存在vector中
vector<Mat> Fusion;
Mat fusion;
for (int i = 0; i < level; i++)
{
fusion = GaussianPyramid_mask[i].mul(apple_LaplacianPyramid[i]) + (Scalar(1.0, 1.0, 1.0) - GaussianPyramid_mask[i]).mul(orange_LaplacianPyramid[i]);
Fusion.push_back(fusion);
}
//金字塔重建与恢复
Mat orapple = Fusion[4];
for (int l = level - 2; l >= 0; l--)
{
Mat up;
pyrUp(orapple, up, Fusion[l].size());
orapple = up + Fusion[l];
}
imshow("orapple", orapple);
waitKey(0);
return 0;
}