OpenCV-影象處理(05、影象混合)
阿新 • • 發佈:2019-01-05
理論-線性混合操作(影象混合有 ·加·減·乘·除·比重 等方式)
- addWeighted:
1.1 比重公式: 0 1 ,其中 α 的取值範圍為0~1之間,f0(x)表示一張影象x位置畫素點的顏色資料,f1(x)表示另一張影象x位置畫素點的顏色資料
1.2 輸出的混合影象計算公式 : dst(I) = saturate_cast(src1(I)*alpha + src2(I)*beta + gamma) 這裡計算的是兩張影象對應位置畫素點的顏色資料
1.3 引數:輸入影象1、影象1的比重、輸入影象2、影象2的比重、gamma值(如果混合的影象較暗,可以使其變數)、輸出混合影象。 兩張影象的大小和型別必須一致才可以
示例:由計算公式可以看出dst是由src1、src2個一半合成的
addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);
- add:對應畫素點的值相加,如果>255,則取255,如果<0,則取0
示例1:dst(I) = saturate_cast(src1(I) + src2(I)) 將對應位置畫素點顏色資料直接相加
addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);
示例2:dst(I) = saturate_cast(src1(I) + Scalar(I)) 將對應位置畫素點顏色資料直接加上固定顏色畫素值,這裡src是三通道的RGB,所以Scalar也是3
addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);
- subtract:
示例:dst(I) = saturate_cast(src1(I) - src2(I)) 將對應位置畫素點顏色資料直接相減,同add一樣,也可以減Scalar
subtract(src1, src2, dst4, Mat());
- multiply:
示例:dst(I) = saturate_cast(src1(I) * src2(I) * scale) 將對應位置畫素點顏色資料相乘再乘scale,同add一樣,也可以乘Scalar
multiply(src1, src2, dst5, 1.0);
- divide:
示例:dst(I) = saturate_cast((src1(I)/src2(I)) * scale) 將對應位置畫素點顏色資料相除再乘scale,同add一樣,也可以除Scalar
divide(src2, src1, dst6, 2.0);
程式碼
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main(int argv,char** argc){
Mat src1,src2,dst;
src1=imread("E:/Experiment/OpenCV/Pictures/WindowsLogo.jpg");
src2=imread("E:/Experiment/OpenCV/Pictures/LinuxLogo.jpg");
if(!src1.data || !src2.data){
cout<<"圖片讀取不到"<<endl;
return -1;
}
imshow("Windows Logo",src1);
imshow("Linux Logo",src2);
if(src1.size()==src2.size() && src1.type()==src2.type()){
Mat dst1, dst2, dst3, dst4, dst5, dst6;
double alpha = 0.5;
//理論-線性混合操作: g(x) = (1-α)*f0(x) + α*f1(x) 其中α的取值範圍為0~1之間,f0(x)表示一張影象x位置畫素點的顏色資料,f1(x)表示另一張
//輸出的混合影象計算公式 : dst(I) = saturate_cast(src1(I)*alpha + src2(I)*beta + gamma) 這裡計算的是兩張影象對應位置畫素點的顏色資料
//引數:輸入影象1、影象1的比重、輸入影象2、影象2的比重、gamma值(如果混合的影象較暗,可以使其變數)、輸出混合影象。 兩張影象的大小和型別必須一致才可以
addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);//由計算公式可以看出dst是由src1、src2個一半合成的
add(src1, src2, dst2, Mat());// dst(I) = saturate_cast(src1(I) + src2(I)) 將對應位置畫素點顏色資料直接相加
add(src1, Scalar(0, 0, 55), dst3);// dst(I) = saturate_cast(src1(I) + Scalar(I)) 將對應位置畫素點顏色資料直接加上固定顏色畫素值,這裡src是三通道的RGB,所以Scalar也是3
subtract(src1, src2, dst4, Mat());// dst(I) = saturate_cast(src1(I) - src2(I)) 將對應位置畫素點顏色資料直接相減,同add一樣,也可以減Scalar
multiply(src1, src2, dst5, 1.0);// dst(I) = saturate_cast(src1(I) * src2(I) * scale) 將對應位置畫素點顏色資料相乘再乘scale,同add一樣,也可以乘Scalar
divide(src2, src1, dst6, 2.0);// dst(I) = saturate_cast((src1(I)/src2(I)) * scale) 將對應位置畫素點顏色資料相除再乘scale,同add一樣,也可以除Scalar
imshow("addWeighted", dst1);
imshow("add_src2", dst2);
imshow("add_scalar", dst3);
imshow("subtract", dst4);
imshow("multiply", dst5);
imshow("divide", dst6);
}else{
cout<<"兩張圖片大小不一致"<<endl;
return -1;
}
waitKey(0);
return 0;
}
效果圖
推薦參考部落格:
https://blog.csdn.net/huanghuangjin/article/details/80875691