博客專欄

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

        獨家|OpenCV 1.4 對圖像的操作

        發布人:數據派THU 時間:2021-08-07 來源:工程師 發布文章

        圖像的輸入/輸出

        從文件中加載圖像:

        1.png

        如果讀入的是一個JPG文件,默認狀態下會創建一個3通道圖像。如果你需要將其制成灰度圖像,則使用以下代碼:

        2.png

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

        3.png

        文件的格式由其擴展名確定。

        用CV :: imdecode和CV :: imencode從內存中讀取和寫入圖像。

        基本的圖像操作

        訪問像素亮度值

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

        4.png

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

        5.png

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

        C ++代碼

        6.png

        Python

        7.png

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

        8.png

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

        9.png

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

        10.png

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

        11.png

        內存管理和引用計數

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

        12.png

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

        13.png

        應為上述每個函數提供一個空的Mat輸出,每一次實現均是對目標矩陣調用一次Mat::create。如果矩陣為空,則利用該方法為矩陣分配數據。如果矩陣不為空,并且大小和數據類型均無誤,則該方法不起作用。然而,如果大小或數據類型與輸入參數不同,則重新分配(和丟失)原有數據,重新分配一個新的數據:

        14.png

        基本操作

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

        15.png

        選擇感興趣的區域:

        16.png

        將彩色圖像轉換成灰度圖像:

        17.png

        將圖像類型從8UC1變為 32FC1:

        18.png

        可視化圖像

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

        19.png

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

        20.png

        這里沒有必要使用CV :: namedWindow函數,因為它后面緊跟著CV :: imshow。然而,可以用cv::createTrackbar來改變窗口屬性。

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

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

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 徐闻县| 青川县| 海口市| 安塞县| 铜梁县| 金华市| 昌宁县| 武夷山市| 贺州市| 无锡市| 郸城县| 当阳市| 汝阳县| 宁陕县| 普宁市| 邹平县| 大同市| 永清县| 安国市| 奉节县| 凌海市| 隆德县| 佛山市| 庆安县| 三穗县| 蒙城县| 康马县| 古田县| 兴义市| 华安县| 尼玛县| 阿拉善右旗| 涞源县| 抚州市| 丘北县| 文化| 无极县| 临湘市| 偃师市| 枣阳市| 乌恰县|