封面圖片選自文森特·梵高的《星空》,公共領域,通過維基共享資源發布
技術世界每天都在變化,對計算機視覺、人工智能和機器學習的需求也在增加。讓計算機和手機能夠看到周圍環境的技術被稱為 計算機視覺。這個重新創造人眼的工作始于 50 年代。從那時起,計算機視覺技術有了長足的發展。計算機視覺已經通過不同的應用進入了我們的手機。這篇文章將介紹 Fedora Linux 上的 OpenCV。
什么是 OpenCV?
OpenCV(開源計算機視覺庫)是一個開源的計算機視覺和機器學習軟件庫。OpenCV 的建立是為了給計算機視覺應用提供一個通用的基礎設施,并加速機器感知在商業產品中的應用。它有超過 2500 種優化后的算法,其中包括一套全面的經典和最先進的計算機視覺和機器學習算法。這些算法可用于檢測和識別人臉、識別物體、對視頻中的人類行為進行分類,并建立標記,將其與增強現實疊加等等。
opencv.org – about
在 Fedora Linux 上安裝 OpenCV
要開始使用 OpenCV,請從 Fedora Linux 倉庫中安裝它:
-
$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy
注意: 在 Fedora Silverblue 或 CoreOS 上,Python 3.9 是核心提交的一部分。用以下方法安裝 OpenCV 和所需工具:
-
rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy
接下來,在終端輸入以下命令,以驗證 OpenCV 是否已經安裝:
-
$ python
-
Python 3.9.6 (default, Jul 16 2021, 00:00:00)
-
[GCC 11.1.1 20210531 (Red Hat 11.1.1-3)] on linux
-
Type "help", "copyright", "credits" or "license" for more information.
-
>>> import cv2 as cv
-
>>> print( cv.__version__ )
-
4.5.2
-
>>> exit()
當你輸入 print
命令時,應該顯示當前的 OpenCV 版本,如上圖所示。這表明 OpenCV 和 Python-OpenCV 庫已經成功安裝。
此外,如果你想用 Jupyter Notebook 做筆記和寫代碼,并了解更多關于數據科學工具的信息,請查看早期的 Fedora Magazine 文章:Fedora 中的 Jupyter 和數據科學。
開始使用 OpenCV
安裝完成后,使用 Python 和 OpenCV 庫加載一個樣本圖像(按 S
鍵以 png 格式保存圖像的副本并完成程序):
-
$ cp /usr/share/opencv4/samples/data/starry_night.jpg .
-
$ python starry_night.py
starry_night.py
的內容:
-
import cv2 as cv
-
import sys
-
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
-
if img is None:
-
sys.exit("Could not read the image.")
-
cv.imshow("Display window", img)
-
k = cv.waitKey(0)
-
if k == ord("s"):
-
cv.imwrite("starry_night.png", img)
通過在 cv.imread
函數中添加參數 0
,對圖像進行灰度處理,如下所示。
-
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
這些是一些可以用于 cv.imread
函數的第二個參數的替代值:
-
cv2.IMREAD_GRAYSCALE
或0
:以灰度模式加載圖像。 -
cv2.IMREAD_COLOR** 或
1`:以彩色模式載入圖像。圖像中的任何透明度將被移除。這是默認的。 -
cv2.IMREAD_UNCHANGED** 或
-1`:載入未經修改的圖像。包括 alpha 通道。
使用 OpenCV 顯示圖像屬性
圖像屬性包括行、列和通道的數量、圖像數據的類型、像素的數量等等。假設你想訪問圖像的形狀和它的數據類型。你可以這樣做:
-
import cv2 as cv
-
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
-
print("Image size is", img.shape)
-
print("Data type of image is", img.dtype)
-
Image size is (600, 752, 3)
-
Data type of image is uint8
-
print(f"Image 2D numpy array {img}")
-
Image 2D numpy array
-
[[[0 0 0]
-
[0 0 0]
-
[0 0 0]
-
...
-
[0 0 0]
-
[0 0 0]
-
[0 0 0]]
-
[[0 0 0]
-
[0 0 0]
-
[0 0 0]
-
...
-
img.shape
:返回一個行數、列數和通道數的元組(如果是彩色圖像)。 -
img.dtype
:返回圖像的數據類型。
接下來用 Matplotlib 顯示圖像:
-
import cv2 as cv
-
import matplotlib.pyplot as plt
-
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
-
plt.imshow(img)
-
plt.show()
發生了什么?
該圖像是作為灰度圖像讀入的,但是當使用 Matplotlib 的 imshow
函數時,它不一定會以灰度顯示。這是因為 imshow
函數默認使用不同的顏色映射。要指定使用灰度顏色映射,請將 imshow
函數的第二個參數設置為 cmap='gray'
,如下所示:
-
plt.imshow(img,cmap='gray')
這個問題在以彩色模式打開圖片時也會發生,因為 Matplotlib 期望圖片為 RGB(紅、綠、藍)格式,而 OpenCV 則以 BGR(藍、綠、紅)格式存儲圖片。為了正確顯示,你需要將 BGR 圖像的通道反轉。
-
import cv2 as cv
-
import matplotlib.pyplot as plt
-
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
-
fig, (ax1, ax2) = plt.subplots(1,2)
-
ax1.imshow(img)
-
ax1.set_title('BGR Colormap')
-
ax2.imshow(img[:,:,::-1])
-
ax2.set_title('Reversed BGR Colormap(RGB)')
-
plt.show()
分割和合并顏色通道
-
import cv2 as cv
-
import matplotlib.pyplot as plt
-
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
-
b,g,r = cv.split(img)
-
fig,ax = plt.subplots(2,2)
-
ax[0,0].imshow(r,cmap='gray')
-
ax[0,0].set_title("Red Channel");
-
ax[0,1].imshow(g,cmap='gray')
-
ax[0,1].set_title("Green Channel");
-
ax[1,0].imshow(b,cmap='gray')
-
ax[1,0].set_title("Blue Channel");
-
# Merge the individual channels into a BGR image
-
imgMerged = cv.merge((b,g,r))
-
# Show the merged output
-
ax[1,1].imshow(imgMerged[:,:,::-1])
-
ax[1,1].set_title("Merged Output");
-
plt.show()
-
cv2.split
:將一個多通道數組分割成幾個單通道數組。 -
cv2.merge
:將幾個數組合并成一個多通道數組。所有的輸入矩陣必須具有相同的大小。
注意: 白色較多的圖像具有較高的顏色密度。相反,黑色較多的圖像,其顏色密度較低。在上面的例子中,紅色的密度是最低的。
轉換到不同的色彩空間
cv2.cvtColor
函數將一個輸入圖像從一個顏色空間轉換到另一個顏色空間。在 RGB 和 BGR 色彩空間之間轉換時,應明確指定通道的順序(RGB2BGR
或 BGR2RGB
)。注意,OpenCV 中的默認顏色格式通常被稱為 RGB,但它實際上是 BGR(字節是相反的)。 因此,標準(24 位)彩色圖像的第一個字節將是一個 8 位藍色分量,第二個字節是綠色,第三個字節是紅色。然后第四、第五和第六個字節將是第二個像素(藍色、然后是綠色,然后是紅色),以此類推。
-
import cv2 as cv
-
import matplotlib.pyplot as plt
-
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
-
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
-
plt.imshow(img_rgb)
-
plt.show()
更多信息
關于 OpenCV 的更多細節可以在在線文檔中找到。
感謝閱讀。
原文鏈接:https://linux.cn/article-13698-1.html