1.6【OpenCV圖像處理】圖像混合

權重相加addWeighted()

(1)理論-線性混合操作:

f0(x)、f1(x)是兩幅圖像,其中a表示圖像的權重(weight ),a取值範圍為0~1之間。隨著x的變動,所有像素都跟著變動,得到混合後的圖像。

(2)相關API (addWeighted)

addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst); //圖像混合API,權重相加

參數1:輸入圖像Mat – src1

參數2:輸入圖像src1的alpha值(a值)

參數3:輸入圖像Mat – src2

參數4:輸入圖像src2的alpha值(1-a值)

參數5:gamma值,額外加的標量,如果兩個加起來太暗了,就加一個常量的值給像素

參數6:輸出混合圖像dst

參數7:dtype = -1默認值不用管

注意點:兩張圖像的大小和類型必須一致才可以

if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {}

saturate()確保值在0~255之間,小於0就是0,大於255就是255。

其他混合方法:

add(src1, src2, dst, Mat());//直接像素相加,效果很不好

multiply(src1, src2, dst, 1.0);//相乘,效果更不好


完整程序:

/*1.6 圖像混合*/#include <opencv2/opencv.hpp> //包含頭文件#include <iostream> using namespace cv; //使用cv命名空間int main(int argc, char** argv) { //argc 表示命令行輸入參數的個數(以空白符分隔),argv中存儲了所有的命令行參數Mat src1,src2, dst; src1 = imread("E:/OpenCV/testimage/test2.jpg"); //載入圖像 src2 = imread("E:/OpenCV/testimage/test3.jpg");if (!src1.data) { //是不是為空 printf("could not load image1...
");return -1; }if (!src2.data) { //是不是為空 printf("could not load image2...
");return -1; }double alpha = 0.5; //權值,係數if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) { //兩圖大小類型一致 addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst); //圖像混合API,權重相加// add(src1, src2, dst, Mat());//直接像素相加,效果很不好// multiply(src1, src2, dst, 1.0);//想乘,效果更不好 imshow("image1", src1); imshow("image2", src2); namedWindow("bland demo", CV_WINDOW_AUTOSIZE); //創建窗口,自動大小 imshow("bland demo", dst); //顯示圖像,窗口標題 }else { printf("could not blend images,the same of images is not same..
");return (-1); } waitKey(0); //等待任意按鍵按下return 0;}

運行結果:


推薦閱讀:

Matlab圖像處理中的傅里葉變換
[171105] 基於 Python OpenCV 圖像處理的車道線檢測

TAG:OpenCV和VisualStudio图像识别应用开发书籍 | OpenCV | 图像处理 |