您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么實(shí)現(xiàn)OpenCV入門(mén),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
OpenCV是一個(gè)開(kāi)源庫(kù),最初由Intel開(kāi)發(fā),它包含了支持計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)的便捷方法和函數(shù)。
我將全神貫注地學(xué)習(xí)如何讀取圖像,如何在Jupyter notebook中顯示圖像以及如何檢查和更改其某些屬性。
import cv2 import numpy as np import matplotlib.pyplot as plt
讓我們從.imread開(kāi)始加載圖片,然后我們可以使用.imshow在新窗口中顯示它。
image = cv2.imread('img.jpg') cv2.imshow('Some title', image) cv2.waitKey(0) cv2.destroyAllWindows()
waitkey和.destroyAllWindows方法對(duì)于在不崩潰的情況下運(yùn)行代碼至關(guān)重要。
第一個(gè)命令將告訴Jupyter繼續(xù)運(yùn)行該塊,直到按下某個(gè)鍵,第二個(gè)命令將在最后關(guān)閉窗口。
我們還可以嘗試使用Matplotlib.imshow顯示圖像;這樣,它將以內(nèi)聯(lián)方式顯示,而不是在新窗口中顯示。
image = cv2.imread('img.jpg') plt.imshow(image)
看起來(lái)很奇怪。顏色都弄亂了。
OpenCV將圖像加載為Numpy數(shù)組,并且它們具有三個(gè)維度:紅色,綠色和藍(lán)色。維度通常稱為通道,它們保存的值介于0到255之間,代表每個(gè)像素的顏色強(qiáng)度。
>>> print(type(image)) >>> print(image.shape) <class 'numpy.ndarray'> (776, 960, 3)
也就是說(shuō)是RGB,對(duì)吧?
不是真的。這是BGR,這是同一件事,但順序不同。
Matplotlib使用RGB,這就是為什么我們的圖片看起來(lái)很奇怪。這不是問(wèn)題,因?yàn)镺penCV有一些非常方便的方法來(lái)轉(zhuǎn)換顏色。
image = cv2.imread('img.jpg') image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) plt.imshow(image)
太酷了,我們必須使用OpenCV閱讀和顯示圖像,并了解如何將GBR顏色轉(zhuǎn)換為RGB以與Matplolib內(nèi)聯(lián)顯示它們。
其他顏色格式可以使用OpenCV處理,例如HSV,CMYK等。
由于我們將重復(fù)很多次,因此我們創(chuàng)建一個(gè)使用Matplotlib進(jìn)行繪圖的方法。我們可以設(shè)置圖的大小并刪除軸以使其更好。
def show(img): fig, ax = plt.subplots(1, figsize=(12,8)) ax.axis('off') plt.imshow(img, cmap='Greys')
請(qǐng)注意,我還將.imshow中的顏色圖定義為“灰色”。當(dāng)我們繪制RGB圖像時(shí),該參數(shù)將被忽略,但是稍后在繪制數(shù)組的各個(gè)維度時(shí)將很有用?,F(xiàn)在,讓我們嘗試一下我們的方法。
image = cv2.imread('img2.jpeg') image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) show(image)
現(xiàn)在讓我們嘗試將其轉(zhuǎn)換為灰度然后再轉(zhuǎn)換為RGB。
image = cv2.imread('img2.jpeg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) image = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB) show(image)
我們可以使用.split獲取顏色的單個(gè)數(shù)組,然后將圖片與.merge組合在一起。這對(duì)于修改,檢查和過(guò)濾數(shù)組的單個(gè)維度非常實(shí)用。
例如,我們可以將數(shù)組乘以零以將其刪除;
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)
我們可以增加或減少顏色的強(qiáng)度,或者構(gòu)建具有相同形狀的新的Numpy數(shù)組來(lái)替換它,或者你可以考慮使用任何其他方法。
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:色調(diào)、飽和度和明度。
這種格式適用于色調(diào),因此很容易過(guò)濾顏色——這意味著,我們可以使用角度范圍,而不必計(jì)算紅色、綠色和藍(lán)色之間的組合范圍。
我們可以用Numpy來(lái)定義HSV的上下邊界。應(yīng)用函數(shù).inRange過(guò)濾這些值,并創(chuàng)建一個(gè)掩碼。然后,我們可以使用.bitwise_and在飽和狀態(tài)下應(yīng)用這個(gè)掩碼,它會(huì)使邊界以外的一切都變成零。
換句話說(shuō):我們可以過(guò)濾一些顏色,然后將其余所有顏色設(shè)置為灰度。
# 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)
分割圖像也可以讓我們更容易地檢查它的構(gòu)圖。
我們可以從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)
使用“灰色”色圖時(shí),值從白色(低)到黑色(高)。
通過(guò)查看第一張地圖,我們可以看出,地面上的藍(lán)色強(qiáng)度高于建筑物中的藍(lán)色強(qiáng)度,并且通過(guò)飽和度圖可以看出,滑板周圍的值高于圖像中其他部分的值。
上述內(nèi)容就是怎么實(shí)現(xiàn)OpenCV入門(mén),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。