OpenCV學習-2:圖片顯示和簡單處理

一、顯示圖片:imread, namewindow, imshow, imwriteios

Mat img = imread("1.jpg"); //讀取圖片
Mat mask = imread("2.jpg", 0); //讀取灰度圖片
namedWindow("顯示圖片"); //建立一個名爲「顯示圖片」的窗口
imshow("顯示圖片", img); //將圖片顯示到指定名稱的窗口
imshow("New Window", img); //也能夠不用建立窗口,直接使用函數建立窗口並顯示圖片
imwrite("3.jpg", img); //保存圖片爲指定名稱

二、融合圖片ROI區域並顯示(ROI=Region Of Intrestting):addWeight函數

Mat img1 = imread("1.jpg"); //讀取圖片1
Mat img2 = imread("2.jpg"); //讀取圖片2
Mat rol1 = img1(Rect(0, 0, img2.cols/2, img2.rows)); //獲取圖片1中的ROI區域(感興趣的區域)
Mat rol2 = img2(Rect(0, 0, img2.cols/2, img2.rows)); //獲取圖片2中的ROI區域(融合圖片必須尺寸同樣)
Mat img;
addWeighted(rol1, 0.5, rol2, 0.5, 0, img); //將圖片1和圖片2的ROI融合並保存到img中
addWeighted(rol1, 0.5, rol2, 0.5, 0, rol1); //將圖片1和圖片2的ROI融合後保存到圖片1中
imwrite("tmp.jpg", img); //保存img圖片到磁盤
imshow("img1", img1); //顯示圖片1,其中ROI區域包含融合後的圖像

三、拆分色彩通道和合並色彩通道spa

Mat img1 = imread("1.jpg"); //讀取圖片1
Mat img2 = imread("2.jpg"); //讀取圖片2
vector<Mat> channels1; //用來保存拆分出來的通道向量
vector<Mat> channels2; //用來保存拆分出來的通道向量
split(img1, channels1); //拆分通道向量,根據OpenCV的BGR色彩空間,channels.at(0)爲blue色彩
//imshow("blue", channels.at(0)); //顯示BGR三個通道的色彩圖像
//imshow("green", channels.at(1));
//imshow("red", channels.at(2));
split(img2, channels2); //拆分圖片2的3個通道
Mat& redch = channels1.at(2);
//通道融合,這裏只能是單通道相融合,不能將red通道和彩色通道融合,不然程序會異常
//也能夠red通道和blue通道融合,相同通道融合顏色變量,反之色彩變暗
addWeighted(redch, 0.5, channels2.at(0), 0.5, 0, redch);
merge(channels1, img1);
imshow("NewImg", img1);

示例代碼:rest

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

//顯示圖片
void ReadImgaeAndShow()
{
    Mat img = imread("1.jpg"); //讀取圖片
    namedWindow("顯示圖片"); //建立一個名爲「顯示圖片」的窗口
    imshow("顯示圖片", img); //將圖片顯示到指定名稱的窗口
    imshow("New Window", img); //也能夠不用建立窗口,直接使用函數建立窗口並顯示圖片
    imwrite("3.jpg", img); //保存圖片爲指定名稱
}

//融合圖片
void ROIAndShowImage()
{
    Mat img1 = imread("1.jpg"); //讀取圖片1
    Mat img2 = imread("2.jpg"); //讀取圖片2
    Mat rol1 = img1(Rect(0, 0, img2.cols/2, img2.rows)); //獲取圖片1中的ROI區域(感興趣的區域)
    Mat rol2 = img2(Rect(0, 0, img2.cols/2, img2.rows)); //獲取圖片2中的ROI區域
    Mat img;
    addWeighted(rol1, 0.5, rol2, 0.5, 0, img); //將圖片1和圖片2的ROI融合並保存到img中
    addWeighted(rol1, 0.5, rol2, 0.5, 0, rol1); //將圖片1和圖片2的ROI融合後保存到圖片1中
    imwrite("tmp.jpg", img); //保存img圖片到磁盤
    imshow("img1", img1); //顯示圖片1,其中ROI區域包含融合後的圖像
}

//多通道拆分和合並,將圖片2與圖片1的紅色通道融合後合併在一塊兒
void SplitAndMerge()
{
    Mat img1 = imread("1.jpg"); //讀取圖片1
    Mat img2 = imread("2.jpg"); //讀取圖片2
    vector<Mat> channels1; //用來保存拆分出來的通道向量
    vector<Mat> channels2; //用來保存拆分出來的通道向量
    split(img1, channels1); //拆分通道向量,根據OpenCV的BGR色彩空間,channels.at(0)爲blue色彩
    //imshow("blue", channels.at(0)); //顯示BGR三個通道的色彩圖像
    //imshow("green", channels.at(1));
    //imshow("red", channels.at(2));
    split(img2, channels2); //拆分圖片2的3個通道
    Mat& redch = channels1.at(2);
    //通道融合,這裏只能是單通道相融合,不能將red通道和彩色通道融合,不然程序會異常
    //也能夠red通道和blue通道融合,相同通道融合顏色變量,反之色彩變暗
    addWeighted(redch, 0.5, channels2.at(0), 0.5, 0, redch);
    merge(channels1, img1);
    imshow("NewImg", img1);
}

int main(int argc, char *argv[])
{
    //ReadImgaeAndShow();
    //ROIAndShowImage();
    SplitAndMerge();

    while(1) {
        waitKey(6000);
    }
    
    return 0;
}
相關文章
相關標籤/搜索