博客專欄

EEPW首頁 > 博客 > 獨(dú)家|OpenCV 1.4 對圖像的操作

獨(dú)家|OpenCV 1.4 對圖像的操作

發(fā)布人:數(shù)據(jù)派THU 時(shí)間:2021-08-07 來源:工程師 發(fā)布文章

圖像的輸入/輸出

從文件中加載圖像:

1.png

如果讀入的是一個(gè)JPG文件,默認(rèn)狀態(tài)下會(huì)創(chuàng)建一個(gè)3通道圖像。如果你需要將其制成灰度圖像,則使用以下代碼:

2.png

文件格式由其內(nèi)容(前幾個(gè)字節(jié))確定。將圖像保存為一個(gè)文件:

3.png

文件的格式由其擴(kuò)展名確定。

用CV :: imdecode和CV :: imencode從內(nèi)存中讀取和寫入圖像。

基本的圖像操作

訪問像素亮度值

為了獲取像素亮度值,首先必須知道圖像的類型和通道數(shù)。下面是一個(gè)單通道灰度圖像的示例(數(shù)據(jù)類型8UC1)和像素坐標(biāo)x和y:

4.png

C ++版本:intensity.val [0]包含從0到255的值,需要注意的是x和y的排序。OpenCV圖像采用了結(jié)構(gòu)化的矩陣來表示,使用以下兩種情形使用同樣的協(xié)議 - 基于0的行索引(或y坐標(biāo))在先,后面跟隨基于0的列索引(或x坐標(biāo))。此外,也可以使用下面的符號(僅適用于C ++ ):

5.png

下面,來看一個(gè)BGR色彩排序的3通道圖像(由imread返回默認(rèn)格式):

C ++代碼

6.png

Python

7.png

對于數(shù)據(jù)類型為浮點(diǎn)值的圖像,可以使用相同的方法(例如,可以通過運(yùn)行Sobel算子獲取一個(gè)通道的圖像)(僅適用于C ++):

8.png

利用相同的方法可以修改像素亮度值:

9.png

OpenCV中有一些函數(shù),尤其是在calib3d模塊中,如CV :: projectPoints函數(shù),可以將 2D或3D像素點(diǎn)值轉(zhuǎn)換成Mat形式的矩陣。該矩陣包含一列,每一行對應(yīng)于一個(gè)點(diǎn),矩陣類型為32FC2或32FC3。利用std::vector可以很容易地構(gòu)建出這樣的矩陣(僅適用于C ++):

10.png

利用相同的方法Mat::at可以訪問矩陣中的點(diǎn)(僅適用于C ++):

11.png

內(nèi)存管理和引用計(jì)數(shù)

Mat是保持矩陣/圖像特性的一種結(jié)構(gòu)(包括行數(shù)和列數(shù),數(shù)據(jù)類型等)和一個(gè)指向數(shù)據(jù)的指針。對應(yīng)一個(gè)相同的圖像數(shù)據(jù),可以構(gòu)建出多個(gè)Mat實(shí)例,此外, Mat還包含一個(gè)引用計(jì)數(shù)器,當(dāng)Mat對象被釋放時(shí),利用引用計(jì)數(shù)器指針來決定是否重新分配數(shù)據(jù)。下面的這個(gè)例子是在不進(jìn)行數(shù)據(jù)復(fù)制的情況下,創(chuàng)建兩個(gè)MAT矩陣: (僅適用于C ++)

12.png

結(jié)果得到了一個(gè)3列的32FC1矩陣,而不是一個(gè)1列的32FC3矩陣。pointsMat使用像素點(diǎn)的數(shù)據(jù),釋放時(shí)無需重新分配內(nèi)存。在這種特殊情況下,開發(fā)人員必須確保 points的生命周期要比比pointsMat的生命周期更長。如果需要復(fù)制數(shù)據(jù)的話,則使用cv::Mat::copyTo或者 cv::Mat::clone兩個(gè)函數(shù):

13.png

應(yīng)為上述每個(gè)函數(shù)提供一個(gè)空的Mat輸出,每一次實(shí)現(xiàn)均是對目標(biāo)矩陣調(diào)用一次Mat::create。如果矩陣為空,則利用該方法為矩陣分配數(shù)據(jù)。如果矩陣不為空,并且大小和數(shù)據(jù)類型均無誤,則該方法不起作用。然而,如果大小或數(shù)據(jù)類型與輸入?yún)?shù)不同,則重新分配(和丟失)原有數(shù)據(jù),重新分配一個(gè)新的數(shù)據(jù):

14.png

基本操作

每一個(gè)像素矩陣均定義有一些快捷的操作符。例如,下面是如何從現(xiàn)有的灰度圖像中提取出黑色圖像IMG

15.png

選擇感興趣的區(qū)域:

16.png

將彩色圖像轉(zhuǎn)換成灰度圖像:

17.png

將圖像類型從8UC1變?yōu)?32FC1:

18.png

可視化圖像

在算法開發(fā)過程中,如果能看到運(yùn)行的中間結(jié)果是非常有用的。OpenCV提供了一種可視化圖像的便捷方式。采用以下代碼可以顯示一副8U圖像:

19.png

調(diào)用waitKey()函數(shù)啟動(dòng)消息傳遞周期,等待“圖像”窗口的一次鍵盤鍵入。此時(shí),需要將32F圖像轉(zhuǎn)換為8U類型的圖像。例如:

20.png

這里沒有必要使用CV :: namedWindow函數(shù),因?yàn)樗竺婢o跟著CV :: imshow。然而,可以用cv::createTrackbar來改變窗口屬性。

本文以C++語言代碼為例,獲取Java和python版本可在原文中查看:

https://docs.opencv.org/4.5.2/d5/d98/tutorial_mat_operations.html

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉