1. 程式人生 > >opencv中的影象簡單的線性融合(附帶測試程式)

opencv中的影象簡單的線性融合(附帶測試程式)

影象融合技術就是將兩個影象進行配比融合顯示的過程,基本原理為:
g(x)=a*f(x)+(1-a)h(x);
g(x)為融合後的影象
f(x)為其中一個影象,h(x)為其中的另一個影象,a為兩幅影象的融合度;原理簡單
實現方式1:
1.先定義感興趣的區域ROI,在其中一幅影象中選取和第二幅影象一樣大小的區域
矩形區域的選取:ROI=IMG(Rect(x,y,loge.cols,loge.rows));
選取法2:ROI=IMG(Range(350,350+loge.rows),Range(800,800+loge.cols));

圖片的大小一定要適合第一幅第二幅的大小切記不然編譯出錯;
1.固定值融合程式:
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;
#define namedWindow1 “原圖”
#define namedWindow2 “原圖1”
#define namedWindow3 “原圖2”

int main()
{
//線性混合操作g(x)=(1-a)f1(x)+bf2(x);
//線性融合的函式為addWeighted(輸入,權值1,輸出,權值2,gamma,輸出,輸出陣列的可選深度);
/這裡補充一下影象的融合操作是有條件的,在融合的過程中影象的尺寸和型別必須要相同/
double alphaValue=0.5;
double betaValue;
Mat img1,img2,img3;
img1=imread(“2.jpg”);
img2=imread(“3.jpg”);
if(!img1.data){printf(“讀取圖片1的資料出錯,請檢視位置是否正確”);}
if(!img2.data){printf(“讀取圖片2的資料出錯,請檢視位置是否正確”);}
betaValue=(1-alphaValue);
addWeighted(img1,alphaValue,img2,betaValue,0.0,img3);
imshow(namedWindow1,img1);
imshow(namedWindow2,img2);
imshow(namedWindow3,img3); //程式從這裡將被割斷
waitKey(0);
return 0;
}
2.線性融合的綜合例項:圖片放到工程中去
#include<opencv2/opencv.hpp>
#include

using namespace cv;
using namespace std;

bool ROI_AddImage()
{
Mat img1=imread(“1.jpg”);
Mat img2=imread(“2.jpg”);
if(!img1.data){printf(“載入圖片1出錯”);return false;}
if(!img2.data){printf(“載入圖片2出錯”);return false;}

Mat imgROI=img1(Rect(0,0,img2.cols,img2.rows));

Mat mask=imread(“img2”,0);
img2.copyTo(imgROI,mask);//把影象放到指定區域中 mask可有可無,記住mask有的話就會使新增到指定區域更加逼真
imshow(“影象融合1”,img2); //影象融合的過程必須是相同大小的圖片和圖片的型別相同
return true;
}
//兩張影象的線性混合
bool linerBlending()
{
Mat img3=imread(“3.jpg”);
Mat img4=imread(“4.jpg”);
if(!img3.data){printf(“載入圖片3錯誤”);return false;}
if(!img4.data){printf(“載入圖片4錯誤”);return false;}
Mat dstImage;
double alphaValue=0.3;
double betaValue=(1-alphaValue);
addWeighted(img3,alphaValue,img4,betaValue,0.0,dstImage);
imshow(“線性融合影象”,dstImage);
}
//指定區域線性混合的利用
bool ROI_LinerBlending()
{
Mat img5=imread(“5.jpg”);
Mat img6=imread(“6.jpg”);
Mat dst1Image;
if(!img5.data){printf(“載入圖片5錯誤”);return false;}
if(!img6.data){printf(“載入圖片6錯誤”);return false;}
Mat img2ROI=img6(Rect(0,0,img5.cols,img5.rows));
addWeighted(img5,0.4,img2ROI,0.7,0.0,dst1Image);
imshow(“指定區域的線性融合”,img6);
return true;
}
int main()
{
if(ROI_AddImage() && linerBlending() && ROI_LinerBlending())
{
cout<<“影象疊加&影象融合成功”<<endl;
}
// waitKey(0);
while(1);
return 0;
}