opencv學習筆記(二)-- 載入、修改和儲存影像

milkhoko發表於2021-01-05

載入影像(imread)

函式舉例:

imshow("output_windows", output_image);

函式介紹

imread功能是載入一個影像檔案使之成為一個Mat物件

  • 其中第一個參數列示的是載入的影像檔名稱
  • 第二個參數列示的是載入影像的型別,就是以什麼方式載入影像,常見的有以下三種引數值
    • IMREAD_UNCHANGED(<0)表示載入原圖,不做任何改變(字面意思)

    • IMREAD_GRAYSCALE(0)表示把原圖作為灰度影像載入進來(grayscale的意思是灰度圖)

    • IMREAD_COLOR(>0)表示把原圖作為RGB影像載入進來

注意: OPENCV支援JPG、PNG、TIFF等常見格式的影像檔案載入

Mat物件

Mat是opencv中用來儲存影像資訊的記憶體物件,Mat物件是C++語言的一種類,具有自動記憶體管理的優點,我們不再需要手動分配其大小並且當不需要它的時候不再需要手動釋放它

Mat物件除了儲存影像的畫素資料以外,還包括影像的其他屬性,具體為寬、高、型別、維度、大小、深度等。具體獲取API如下:

Mat src = Imgcodecs.imread(file.getPath());
int width = src.cols();//寬
int height = src.rows();//高
int dims = src.dims();//維度
int channels = src.channels();//通道數
int depth = src.depth();//深度
int type = src.type();//型別資訊

Imgcodecs是OpenCV影像輸入和輸出模組

顏色空間

點陣圖模式

點陣圖模式是影像中最基本的格式,影像只有黑色和白色畫素,是色彩模式中佔有空間最小的,同樣也叫做黑白圖,它包含的資訊量最少,無法包含影像中的細節,相當於只有0或者1

一副彩色圖如果要轉換成黑白模式,則一般不能直接轉換,需要首先將影像轉換成灰度模式

灰度模式

灰度模式即使用單一色調來表示影像,與點陣圖模式不同,不像點陣圖只有0和1,使用256級的灰度來表示影像,一個畫素相當於佔用8為一個位元組,每個畫素值使用0到255的亮度值代表,其中0為黑色,255為白色,相當於從黑->灰->白的過度,通常我們所說的黑白照片就是這種模式,與點陣圖模式相比,能表現出一定的細節,佔用空間也比點陣圖模式較大

RGB模式

RGB模式為我們經常見到的,被稱為真色彩。RGB模式的影像有3個顏色通道,分佈為紅(Red),綠(Green)和藍(Bule),每個都佔用8位一個位元組來表示顏色資訊,這樣每個顏色的取值範圍為0~255,那麼就三種顏色就可以有多種組合,當三種基色的值相等是,表現出為灰色,三種顏色都為255即為白色,三種顏色都為0,即為黑色
RGB模式的影像佔用空間要比點陣圖,灰度圖都要大,但表現出的細節更加明顯

CMYK模式

CMYK模式被稱為印刷色彩模式,主要是來源於印刷行業,以列印油墨在紙張上的光線吸收特性為基礎,與RGB類似,也是使用三種顏色,分別為青色(Cyan),品紅色(Magenta),黃色(Yellow),以及黑色(Black)
與RGB不同的是:RGB模式依靠的是自身發光的色彩模式,而CMYK是一種依靠反光的色彩模式。

HSB模式

是根據日常生活中人眼的視覺對色彩的觀察得而制定的一套色彩模式,最接近與人類對色彩的辨認的思考方式,所有的顏色都是用色彩三屬性來描述
H:(色相):是指從物體反射或透過物體傳播的顏色
S:(飽和度):是指顏色的強度或純度,表示色相中灰色成分所佔的比例
B:(亮度):是指顏色對相對明暗程度,通常 100%定義為白色;0%為黑色

YUV格式

除了上述影像模式之外,由於歷史原因大部分攝像頭輸入的圖片格式都是YUV格式,開始主要用於電視系統以及模擬視訊領域。
在影像的處理過程中,很少使用YUV格式,一般都需要轉成RGB格式或者灰度圖格式進行轉換,而opencv的cvtColor()函式支援這種轉換。

顯示影像(namedWindows與imshow)

namedWindows()

函式舉例

namedWindow("test_opencv", CV_WINDOW_AUTOSIZE);

在這裡插入圖片描述

函式介紹

namedwindow()功能是建立一個OpenCV的視窗,它是由OpenCV自動建立與釋放的,你無需手動銷燬它,他有兩個引數:

  1. 第一個是視窗的名稱,建立之後會顯示在視窗上
  2. 第二個引數為視窗的標識,來控制視窗的大小,一般預設為是WINDOW_AUTOSIZE另外還有以下兩種
引數含義
WINDOW_AUTOSIZE視窗大小自動適應圖片大小,並且不可手動更改
WINDOW_NORMAL使用者可以改變這個視窗大小

imshow()

函式舉例

imshow("test_opencv", src);

在這裡插入圖片描述

函式介紹

imshow()函式會根據視窗名稱將對應的圖片顯示在指定的視窗上,它同樣有兩個引數

  1. 第一個引數是對應的視窗的名稱,即namedwindow()的第一個引數
  2. 第二個引數是在對應視窗上顯示的影像,是一個Mat物件

修改影像顏色空間(cvtColor)

這裡的修改影像就是轉變影像的顏色空間

函式舉例

	Mat grysrc;
	namedWindow("test_opencv_grysrc", CV_WINDOW_AUTOSIZE);
	cvtColor(src,grysrc, COLOR_BGR2GRAY);
	imshow("test_opencv_grysrc", grysrc);

在這裡插入圖片描述

函式介紹

cvtColor()的功能是把圖從一個色彩空間轉換到另外一個色彩空間,有三個引數:

  1. 第一個引數是原影像
  2. 第二個參數列示的是色彩空間轉換之後的影像
  3. 第三個參數列示的源和目標的色彩空間,如下
引數含義
COLOR_BGR2HLS由BGR空間轉換到HLS空間
COLOR_BGR2GRAY由BGR空間轉換到GRAY灰度空間
COLOR_BGR2HSV由BGR空間轉換到hsv灰度空間
COLOR_GRAY2BGR由GRAY灰度空間轉換到BGR空間
COLOR_HLS2RGB由HLS空間轉換到RGB空間

等等許多,大家可以自己研究
注意: 這裡的RGB和BGR有一點點不同,感興趣的可以百度

儲存影像(imwrite)

函式舉例

imwrite("A:/opencvproject/grysrc.png", grysrc);

在這裡插入圖片描述
執行完之後會在對應的目錄生成一個你想要的圖片

函式介紹

imwrite()函式是將一個圖片儲存下來,它有兩個引數:

  1. 第一個引數是指定影像儲存的路徑以及檔名稱
  2. 第二個引數是指定要儲存的目標影像,是一個Mat物件

完整程式

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

using namespace cv;
int main(int argc, char** argv) {
	Mat src = imread("A:/opencvproject/pikaqiu.jpg");
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("test_opencv_src", CV_WINDOW_AUTOSIZE);
	imshow("test_opencv_src", src);

	Mat grysrc;
	namedWindow("test_opencv_grysrc", CV_WINDOW_AUTOSIZE);
	cvtColor(src,grysrc, COLOR_BGR2GRAY);
	imshow("test_opencv_grysrc", grysrc);
	
	imwrite("A:/opencvproject/grysrc.png", grysrc);

	waitKey(0);
	return 0;
}

相關文章