1、讀取,寫入和顯示圖像
在使用計算機視覺進行任何操作之前,我們需要理解計算機如何處理圖像。計算機唯一可以處理的信息是二進制信息(0和1),其中包括文本,圖像和視頻。那么計算機如何處理圖像呢?我們要知道計算機如何“理解”圖像,可以對圖像大小的矩陣進行拍照,在每個單元格上分配一個表示該位置圖像顏色的值。讓我們以灰度圖像為例:
對于這種特殊情況,我們可以為圖像中的每個塊(或像素)分配一個數(shù)值(可以解釋為二進制)。我們習慣上將0表示黑色,將255表示白色,以及介于兩者之間的所有整數(shù)代表強度,但該數(shù)值可以在任何范圍內(nèi)。
當我們處理彩色圖像時,根據(jù)庫和我們選擇表示顏色的方式,情況可能會有所不同。我們將在后面的文章中進一步討論這一點,但是,它們或多或少都具有相同的想法,即使用不同的通道表示顏色,它們也是是RGB(紅色,綠色和藍色)最受歡迎的選項之一。使用RGB,我們需要3個通道來構建每個像素,因此我們的2d矩陣現(xiàn)在是深度為3的3d矩陣,其中每個通道都是特定顏色的強度,并且在混合時我們獲得了像素的最終顏色。
2、使用OpenCV處理圖像
現(xiàn)在,讓我們跳入到代碼中,以處理圖像,讀取,顯示和保存時執(zhí)行3個最重要的功能。
如果運行我們上面的代碼,現(xiàn)在將獲得一張圖像保存到磁盤,另一張圖像作為打印結果。
左邊的圖像是我們繪制的圖像,而右邊的圖像是保存到磁盤的圖像。拋開尺寸的不同,左側(cè)的圖像看起來很奇怪,看上去有點藍色,但是為什么不同呢?(順便說一句,右邊的圖像是正確的)。左側(cè)圖像看起來顏色奇怪的原因與OpenCV默認情況下讀取圖像的方式有關。OpenCV imread()函數(shù)將使用BGR通道讀取圖像,該圖像應為繪圖功能所使用的RGB。對于OpenCV,這是正?,F(xiàn)象,我們將在下文中講解如何修復它的方法。
3、改變色彩空間
什么是色彩空間?在前面的示例中,我們看到了計算機如何處理圖像,并且看到了要表示顏色的顏色,我們需要使用通道,這些通道組合在一起后就可以得出圖像的最終顏色。設置這些通道的配置是色彩空間。我們在先前的代碼片段中已經(jīng)覆蓋了2個不同的顏色空間,我們使用了RGB和BGR,但是還有更多具有非常特殊和有趣特性的屬性(一些流行的色彩空間包括LAB,YCrCb,HLS和HSV)。由于每個色彩空間都有其自身的屬性,因此某些算法或技術在一個色彩空間中可能比其他色彩空間更好地工作,因此在這些色彩空間之間更改圖像非常重要,而且值得慶幸的是,OpenCV為我們提供了一個非常易于使用的功能。讓我們看看如何使用它來修復上面的圖(使用cvtColor)
現(xiàn)在我們得到了一只漂亮的棕色狗:
讓我們嘗試其他的色彩空間:
4、調(diào)整圖像大小
現(xiàn)在我們已經(jīng)可以加載顯示和更改圖像的色彩空間,接下來我們需要注意的是調(diào)整大小。在計算機視覺中調(diào)整圖像大小非常重要,因為ML中的學習模型可以使用固定大小的輸入。大小將取決于模型,但是要確保我們的圖像能在模型上工作,我們需要相應地調(diào)整它們的大小。而且OpenCV提供了一種實用的方法來執(zhí)行此操作,稱為resize,讓我們看一個如何使用它。
輸出:
5、旋轉(zhuǎn)圖像
在許多情況下,將圖像旋轉(zhuǎn)到不同角度可以幫助我們提高模型的效率,但是在這里我們不會全部介紹。相反,我只向你展示如何使用OpenCV旋轉(zhuǎn)圖像。OpenCV中rotate函數(shù)示例:
盡管此方法使用非常容易,但也將我們限制在幾個選項中,我們無法以任何角度旋轉(zhuǎn)。為了更好地控制旋轉(zhuǎn),我們可以改用getRotationMatrix2D和warpAffine。
6、邊緣檢測
邊緣是圖像亮度急劇變化或不連續(xù)的點。這種不連續(xù)通常對應于:
1、深度不連續(xù)
2、表面取向不連續(xù)
3、材料特性的變化
4、場景照明的變化
邊緣是圖像的非常有用的功能,可以用作ML管道的一部分,我們已經(jīng)看到了一些有關邊緣如何幫助我們檢測道路上的形狀或線條的示例。CV2為我們提供了Canny函數(shù)來完成此任務,下面是如何使用它:
7、最后
OpenCV是用于處理圖像和視頻的一個比較出色的庫,它提供了大量有用的工具和功能,可以處理從最簡單到最復雜的場景。我們今天講述的功能只是圖庫中的一部分。如果你有興趣瀏覽庫文檔,可以自行去查看樣本,從簡單的圖像處理(如轉(zhuǎn)置)到更高級的功能(如輪廓檢測,特征檢測甚至人臉檢測),都有很多。
更多詳細信息,請您微信關注“計算網(wǎng)”公眾號: