OpenCV入門

做者|Thiago Carvalho
編譯|Flin
來源|towardsdatasciencehtml

不久前,我爲一個大學項目訓練了一個目標檢測模型,但說實話,除了它須要不少紅牛和長時間的觀察個人訓練模型,我不記得太多了。python

最近我對這些話題重拾了一些興趣,我決定從新開始,從新學習,但這一次我會作筆記並分享個人學習經驗。api

我想知道有一天咱們是否可以使用風格遷移將一種風格從一個數據複製到另外一個數據而不損害其完整性。數組

OpenCV

OpenCV是一個開源庫,最初由Intel開發,它包含了支持計算機視覺和機器學習的便捷方法和函數。app

在本文中,我將全神貫注地學習如何讀取圖像,如何在Jupyter notebook中顯示圖像以及如何檢查和更改其某些屬性。機器學習

import cv2
import numpy as np
import matplotlib.pyplot as plt

讓咱們從.imread開始加載圖片,而後咱們可使用.imshow在新窗口中顯示它。函數

image = cv2.imread('img.jpg')
cv2.imshow('Some title', image)

cv2.waitKey(0)
cv2.destroyAllWindows()

waitkey和.destroyAllWindows方法對於在不崩潰的狀況下運行代碼相當重要。學習

第一個命令將告訴Jupyter繼續運行該塊,直到按下某個鍵,第二個命令將在最後關閉窗口。ui

咱們還能夠嘗試使用Matplotlib.imshow顯示圖像;這樣,它將之內聯方式顯示,而不是在新窗口中顯示。.net

image = cv2.imread('img.jpg')
plt.imshow(image)

看起來很奇怪。顏色都弄亂了。

OpenCV將圖像加載爲Numpy數組,而且它們具備三個維度:紅色,綠色和藍色。維度一般稱爲通道,它們保存的值介於0到255之間,表明每一個像素的顏色強度。

>>> print(type(image))
>>> print(image.shape)

<class 'numpy.ndarray'>
(776, 960, 3)

也就是說是RGB,對吧?

不是真的。這是BGR,這是同一件事,但順序不一樣。

Matplotlib使用RGB,這就是爲何咱們的圖片看起來很奇怪。這不是問題,由於OpenCV有一些很是方便的方法來轉換顏色。

image = cv2.imread('img.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image)

太酷了,咱們必須使用OpenCV閱讀和顯示圖像,並瞭解如何將GBR顏色轉換爲RGB以與Matplolib內聯顯示它們。

其餘顏色格式可使用OpenCV處理,例如HSV,CMYK等。

色彩

因爲咱們將重複不少次,所以咱們建立一個使用Matplotlib進行繪圖的方法。咱們能夠設置圖的大小並刪除軸以使其更好。

def show(img):
    fig, ax = plt.subplots(1, figsize=(12,8))
    ax.axis('off')   
    plt.imshow(img, cmap='Greys')

請注意,我還將.imshow中的顏色圖定義爲「灰色」。當咱們繪製RGB圖像時,該參數將被忽略,可是稍後在繪製數組的各個維度時將頗有用。如今,讓咱們嘗試一下咱們的方法。

image = cv2.imread('img2.jpeg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

show(image)

如今讓咱們嘗試將其轉換爲灰度而後再轉換爲RGB。

image = cv2.imread('img2.jpeg')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB)

show(image)

咱們可使用.split獲取顏色的單個數組,而後將圖片與.merge組合在一塊兒。這對於修改,檢查和過濾數組的單個維度很是實用。

例如,咱們能夠將數組乘以零以將其刪除;

img = cv2.imread('img2.jpeg')

B, G, R = cv2.split(img) 
img = cv2.merge([B*0, G, R*0])

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
show(img)

咱們能夠增長或減小顏色的強度,或者構建具備相同形狀的新的Numpy數組來替換它,或者你能夠考慮使用任何其餘方法。

img = cv2.merge([np.ones_like(B)*255, G, R])

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
show(img)

一樣的分割和合並概念也適用於其餘格式,如HSV和HSL。

img = cv2.imread('img2.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

H, S, V = cv2.split(img)
 
img = cv2.merge([np.ones_like(H)*30, S+10, V-20])

img = cv2.cvtColor(img, cv2.COLOR_HSV2RGB)
show(img)

HSV:色調、飽和度和明度。

這種格式適用於色調,所以很容易過濾顏色——這意味着,咱們可使用角度範圍,而沒必要計算紅色、綠色和藍色之間的組合範圍。

咱們能夠用Numpy來定義HSV的上下邊界。應用函數.inRange過濾這些值,並建立一個掩碼。而後,咱們可使用.bitwise_and在飽和狀態下應用這個掩碼,它會使邊界之外的一切都變成零。

換句話說:咱們能夠過濾一些顏色,而後將其他全部顏色設置爲灰度。

# read img and convert to HSV
img = cv2.imread('img2.jpeg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# split dimensions
H, S, V = cv2.split(img)
# upper and lower boundaries
lower = np.array([80, 0, 0]) 
upper = np.array([120, 255, 255])
# build mask
mask = cv2.inRange(img, lower, upper)
# apply mask to saturation
S = cv2.bitwise_and(S, S, mask=mask)
# assemble image
img = cv2.merge([H, S, V])
# convert to RGB and display
img = cv2.cvtColor(img, cv2.COLOR_HSV2RGB)
show(img)

分割圖像也可讓咱們更容易地檢查它的構圖。

咱們能夠從RGB繪製顏色,從HSV繪製飽和度,或任何其餘咱們想要的通道。

img = cv2.imread('img2.jpeg')
B, G, R = cv2.split(img) 
show(B)

img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
H, S, V = cv2.split(img)
show(S)

使用「灰色」色圖時,值從白色(低)到黑色(高)。

經過查看第一張地圖,咱們能夠看出,地面上的藍色強度高於建築物中的藍色強度,而且經過飽和度圖能夠看出,滑板周圍的值高於圖像中其餘部分的值。

今天我就講到此處。咱們探索瞭如何加載和顯示圖片,如何將數組轉換爲不一樣的顏色格式以及如何訪問,修改和過濾通道。

在下一篇文章中,我將嘗試探索變換以及如何移動、調整大小、裁剪和旋轉圖像。

謝謝你閱讀個人文章。但願你喜歡。

資源:

原文連接:https://towardsdatascience.com/getting-started-with-opencv-249e86bd4293

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/

相關文章
相關標籤/搜索