作者|Thiago Carvalho
編譯|Flin
來源|towardsdatascience

不久前,我為一個大學專案訓練了一個目標檢測模型,但說實話,除了它需要很多紅牛和長時間的觀察我的訓練模型,我不記得太多了,
最近我對這些話題重拾了一些興趣,我決定重新開始,重新學習,但這一次我會做筆記并分享我的學習經驗,
我想知道有一天我們是否能夠使用風格遷移將一種風格從一個資料復制到另一個資料而不損害其完整性,
OpenCV
OpenCV是一個開源庫,最初由Intel開發,它包含了支持計算機視覺和機器學習的便捷方法和函式,
在本文中,我將全神貫注地學習如何讀取影像,如何在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繼續運行該塊,直到按下某個鍵,第二個命令將在最后關閉視窗,
我們還可以嘗試使用Matplotlib.imshow顯示影像;這樣,它將以行內方式顯示,而不是在新視窗中顯示,
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)

使用“灰色”色圖時,值從白色(低)到黑色(高),
通過查看第一張地圖,我們可以看出,地面上的藍色強度高于建筑物中的藍色強度,并且通過飽和度圖可以看出,滑板周圍的值高于影像中其他部分的值,
今天我就講到此處,我們探索了如何加載和顯示圖片,如何將陣列轉換為不同的顏色格式以及如何訪問,修改和過濾通道,
在下一篇文章中,我將嘗試探索變換以及如何移動、調整大小、裁剪和旋轉影像,
謝謝你閱讀我的文章,希望你喜歡,
資源:
-
OpenCV讀取影像;
- https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_image_display/py_image_display.html
-
OpenCV顏色轉換;
- https://docs.opencv.org/3.4/de/d25/imgproc_color_conversions.html
-
Matplotlib顯示影像;
- https://matplotlib.org/api/_as_gen/matplotlib.pyplot.imshow.html
-
陣列上的OpenCV操作;
- https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html
-
OpenCV基本操作;
- https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_basic_ops/py_basic_ops.html
原文鏈接:https://towardsdatascience.com/getting-started-with-opencv-249e86bd4293
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/715.html
標籤:其他
上一篇:OpenCV有多酷?
