一、圖像加法
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 void main(){ 7 Mat img1=imread("E://1.jpg"); 8 Mat img2=imread("E://2.jpg"); 9 Mat dst;//存儲結果 10 imshow("img1",img1); 11 imshow("img2",img2); 12 cout<<"img1 "<<int(img1.at<Vec3b>(10,10)[0])<<endl;//img1在坐標(10,10)的藍色通道的值,強制轉成int 13 cout<<"img2 "<<int(img2.at<Vec3b>(10,10)[0])<<endl; 14 15 dst=img1+img2;//這兩個加法效果相同 16 //add(img1,img2,dst);//注意:這兩個加法要求被加的圖片尺寸必須一致 17 //addWeighted(img1,0.5,img2,0.5,0,dst);//按權重相加,下一行dst輸出參數為正常參數的一半 18 cout<<"dst "<<int(dst.at<Vec3b>(10,10)[0])<<endl; 19 imshow("dst",dst); 20 waitKey(0); 21 }
兩幅圖的(10,10)處藍色通道值相加大於了255,所以dst值為255,我們換一個小一點的坐標(420,420)試試
二、圖像減法
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 using namespace cv; 4 using namespace std; 5 6 void main(){ 7 Mat img1=imread("E://1.jpg"); 8 Mat img2=imread("E://5.jpg"); 9 Mat dst;//存儲結果 10 imshow("img1",img1); 11 imshow("img2",img2); 12 cout<<"img1 "<<int(img1.at<Vec3b>(10,10)[0])<<endl;//img1在坐標(10,10)的藍色通道的值,強制轉成int 13 cout<<"img2 "<<int(img2.at<Vec3b>(10,10)[0])<<endl; 14 15 //dst=img1-img2;//這兩個減法效果相同 若dst<0,則dst=0 16 //subtract(img1,img2,dst);//注意:要求被處理圖片尺寸一致 17 absdiff(img1,img2,dst);//若dst<0,則dst=|dst|>=0 用於檢測兩幅相似圖像的不同點,效果比上面的兩種減法好 18 cout<<"dst "<<int(dst.at<Vec3b>(10,10)[0])<<endl; 19 imshow("dst",dst); 20 waitKey(0); 21 }
三、乘除與或非
1 dst=5*img1;//增加曝光 2 dst=img1/5;//降低曝光 3 bitwise_and(img1,img2,dst);//邏輯與,求交集 4 bitwise_or(img1,img2,dst);//邏輯或,求並集 5 bitwise_not(img1,dst);//邏輯非,求補集 6 bitwise_xor(img1,img2,dst);//異或,相同為0,相異為1