1.分離
將一張圖像分別分成三個通道的圖像.
使用split()函數,分離之後的數據存到一個Mat對象的容器中.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../meizi.jpg");
if(src.empty())
{
printf("不能找到文件。\n");
return -1;
}
namedWindow("input",WINDOW_AUTOSIZE);
imshow("input", src);
vector<Mat> mv;
split(src,mv);
imshow("blue channel",mv[0]);
imshow("green channel",mv[1]);
imshow("red channel",mv[2]);
waitKey(0);
destroyAllWindows();
return 0;
}
輸出結果:
原圖:
blue通道:
red通道:
green通道:
可明顯看出來紅色通道亮度最高,即佔比最大.
2.合併
將紅色通道去掉再合併的效果:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../meizi.jpg");
if(src.empty())
{
printf("不能找到文件。\n");
return -1;
}
namedWindow("input",WINDOW_AUTOSIZE);
imshow("input", src);
// 分離
vector<Mat> mv;
split(src,mv);
// 合併,將紅色通道去掉再合併的效果
mv[2] = Scalar(0);
Mat dst;
merge(mv,dst);
imwrite("../result.jpg",dst);
imshow("result",dst);
waitKey(0);
destroyAllWindows();
return 0;
}
結果:
假如綠色通道缺失:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../meizi.jpg");
if(src.empty())
{
printf("不能找到文件。\n");
return -1;
}
namedWindow("input",WINDOW_AUTOSIZE);
imshow("input", src);
// 分離
vector<Mat> mv;
split(src,mv);
// 合併,green通道缺失的情況
mv[1] = Scalar(0);
Mat dst;
merge(mv,dst);
imwrite("../result.jpg",dst);
imshow("result",dst);
waitKey(0);
destroyAllWindows();
return 0;
}
結果:
藍色通道缺失:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../meizi.jpg");
if(src.empty())
{
printf("不能找到文件。\n");
return -1;
}
namedWindow("input",WINDOW_AUTOSIZE);
imshow("input", src);
// 分離
vector<Mat> mv;
split(src,mv);
// 合併,blue通道缺失的情況
mv[0] = Scalar(0);
Mat dst;
merge(mv,dst);
imwrite("../result.jpg",dst);
imshow("result",dst);
waitKey(0);
destroyAllWindows();
return 0;
}
結果:
將綠色通道取反再令其缺失:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../meizi.jpg");
if(src.empty())
{
printf("不能找到文件。\n");
return -1;
}
namedWindow("input",WINDOW_AUTOSIZE);
imshow("input", src);
// 分離
vector<Mat> mv;
split(src,mv);
// 將綠色通道比重增大(取反)
bitwise_not(mv[2],mv[2]);
// 合併,增大後的green通道缺失的情況
mv[2] = Scalar(0);
Mat dst;
merge(mv,dst);
imwrite("../result.jpg",dst);
imshow("result",dst);
waitKey(0);
destroyAllWindows();
return 0;
}
結果:
3.補充API---ROI
這個api是用來截圖圖像的,通過設置參數可以截取部分圖像,要注意一個問題,截取的圖像改變的話,是會改變原圖像的,因爲兩者指向的是同一個內存對象.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
// 讀入圖像
Mat src = imread("../meizi.jpg");
if(src.empty())
{
printf("不能找到文件。\n");
return -1;
}
namedWindow("input",WINDOW_AUTOSIZE);
imshow("input", src);
// 分離
vector<Mat> mv;
split(src,mv);
Rect roi;
roi.x = 100;
roi.y = 100;
roi.width = 250;
roi.height = 200;
Mat sub = src(roi);
rectangle(src,roi,Scalar(255,255,0),1,8);
imshow("roi",sub);
imshow("input",src);
waitKey(0);
destroyAllWindows();
return 0;
}
輸出結果:
如果想要截取的圖像不能改變原圖像:
Mat sub = src(roi).clone();