計算機視覺的重點是從計算機中的視頻和圖像中提取有意義的信息。在本文中,我們將從初學者開始探索一個使用 OpenCV 的出色計算機視覺項目。其標題是「使用計算機視覺進行邊緣和輪廓檢測」。對於此項目,你還將看到描述、原始碼和圖像分類。邊緣檢測邊緣檢測是一種用於定位圖像中對象邊界的圖像處理技術。最流行和廣泛使用的算法之一是 Canny 邊緣檢測器。Canny 邊緣檢測器是一種立足點檢測算子,它使用多階段算法來檢測圖像中的各種邊緣。在 Sobel 濾波器的幫助下,找出邊緣的強度和方向。通過應用非極大值抑制來隔離更強的邊緣並將它們細化為一條像素寬的線。
pip3 install opencv-python matplotlib numpy
import cv2
import numpy as np
import matplotlib.pyplot as plt
# read the image
image = cv2.imread("little_flower.jpg")
首先,我們必須將圖像轉換為灰度,然後,我們可以繼續將圖像繞過 Canny 邊緣檢測器。# convert it to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# show the grayscale image
plt.imshow(gray, cmap="gray")
plt.show()
在 Canny 算法的幫助下,我們必須標記作為輸入的圖像中的邊緣。輸入圖像首先傳遞給 cv2.Canny() 函數,然後用於邊緣檢測。# perform the canny edge detector to detect image edges
edges = cv2.Canny(gray, threshold1=30, threshold2=100)
閾值 1 和閾值 2 之間的最小值用於邊緣連結。最重要的值用於尋找強邊緣的初始段。有趣的是,嘗試微調邊緣值,看看你是否會讓它變得更好。import NumPy as np
import cv2
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 30, 100)
cv2.imshow("edges", edges)
cv2.imshow("gray", gray)
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
檢測邊緣的最終目的是捕捉重要事件並在行星屬性內執行所需的更改。它是圖像處理、圖像模式識別和計算機視覺技術的基本步驟之一。輪廓檢測一個輪廓可以描述為一條曲線,將所有具有相同顏色或強度的連續點組合在一起。基本上,它們顯示圖片中包含的對象的形狀。輪廓檢測可能是一種用於形狀分析和對象檢測和識別的有用技術。輪廓檢測並不是圖像分割的唯一算法,還有很多其他算法,例如目前最先進的語義分割、霍夫變換和 K-Means 分割。為了獲得更好的準確性,我們將遵循以下整個流程來成功檢測圖像中的輪廓:輸入圖像的標準化是它應該始終是二進位形式。這就是為什麼我們需要將其轉換為二進位格式。用於查找輪廓的 OpenCV 函數是 findContours()。pip3 install matplotlib opencv-python
import cv2
import matplotlib.pyplot as plt
# read the image
image = cv2.imread("thumbs_up_down.jpg")
# convert to RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
正如本教程前面提到的,我們要創建一個二值圖像,這表明圖像的每個像素要麼是黑色的,要麼是白色的。你可以將其進行比較,就像查找輪廓與檢測黑板上的白色物體更相似。我們要找的物體是白色的,所以黑板需要是純黑色的。# create a binary thresholded image
_, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
# show it
plt.imshow(binary, cmap="gray")
plt.show()
通過禁用像素(即將其設置為0)和啟用像素(即將其設置為225),創建二進位圖像。以下是輸出圖像:現在,對於 OpenCV 來說,這通常很容易檢測輪廓:# find the contours from the thresholded image
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw all contours
image = cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
上述代碼很容易找到二值圖像中的輪廓,最後藉助粗綠線將它們輸出到圖像中,讓我們展示一下:# show the image with the drawn contours
plt.imshow(image)
plt.show()
為了在不同的世界圖像上獲得良好的結果,你需要調整閾值或執行邊緣檢測。例如,對於煎餅圖像,我將邊緣減少到 127,結果如下:輪廓檢測和邊緣檢測的區別輪廓檢測的目標是確定閉合物體的形狀,特別是因為對於具有相同顏色強度的連續點,尋找輪廓的方法是確定的,而邊緣檢測是通過檢測顏色強度內的變化來進行的。對整個圖像進行邊緣檢測,而僅對圖像內的對象進行輪廓檢測。結論這個項目是初學者級別的,面向數據科學愛好者。本文旨在讓你熟悉最簡單的計算機視覺項目,以增強你在計算機視覺方面的知識。如果看到這裡,說明你喜歡這篇文章,請轉發、點讚。微信搜索「uncle_pn」,歡迎添加小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。