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 | 图像处理 |