計(jì)算機(jī)視覺的重點(diǎn)是從計(jì)算機(jī)中的視頻和圖像中提取有意義的信息,。在本文中,我們將從初學(xué)者開始探索一個(gè)使用 OpenCV 的出色計(jì)算機(jī)視覺項(xiàng)目,。其標(biāo)題是“使用計(jì)算機(jī)視覺進(jìn)行邊緣和輪廓檢測(cè)”,。對(duì)于此項(xiàng)目,,你還將看到描述、源代碼和圖像分類,。邊緣檢測(cè)邊緣檢測(cè)是一種用于定位圖像中對(duì)象邊界的圖像處理技術(shù),。最流行和廣泛使用的算法之一是 Canny 邊緣檢測(cè)器。Canny 邊緣檢測(cè)器是一種立足點(diǎn)檢測(cè)算子,,它使用多階段算法來檢測(cè)圖像中的各種邊緣,。- 在 Sobel 濾波器的幫助下,,找出邊緣的強(qiáng)度和方向。
- 通過應(yīng)用非極大值抑制來隔離更強(qiáng)的邊緣并將它們細(xì)化為一條像素寬的線,。
pip3 install opencv-python matplotlib numpy
打開一個(gè) Python 文件并按照以下步驟操作:import cv2 import numpy as np import matplotlib.pyplot as plt
現(xiàn)在為了檢測(cè)它的邊緣,,我們必須讀取圖像:# read the image image = cv2.imread('little_flower.jpg')
首先,,我們必須將圖像轉(zhuǎn)換為灰度,然后,,我們可以繼續(xù)將圖像繞過 Canny 邊緣檢測(cè)器,。# convert it to grayscale gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# show the grayscale image plt.imshow(gray, cmap='gray') plt.show()
在 Canny 算法的幫助下,我們必須標(biāo)記作為輸入的圖像中的邊緣,。輸入圖像首先傳遞給 cv2.Canny() 函數(shù),,然后用于邊緣檢測(cè)。# perform the canny edge detector to detect image edges edges = cv2.Canny(gray, threshold1=30, threshold2=100)
閾值 1 和閾值 2 之間的最小值用于邊緣鏈接,。最重要的值用于尋找強(qiáng)邊緣的初始段,。有趣的是,嘗試微調(diào)邊緣值,,看看你是否會(huì)讓它變得更好,。如果你想使用實(shí)時(shí)攝像頭,這里是完整的代碼: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()
檢測(cè)邊緣的最終目的是捕捉重要事件并在行星屬性內(nèi)執(zhí)行所需的更改,。它是圖像處理,、圖像模式識(shí)別和計(jì)算機(jī)視覺技術(shù)的基本步驟之一。輪廓檢測(cè)一個(gè)輪廓可以描述為一條曲線,,將所有具有相同顏色或強(qiáng)度的連續(xù)點(diǎn)組合在一起,。基本上,,它們顯示圖片中包含的對(duì)象的形狀,。輪廓檢測(cè)可能是一種用于形狀分析和對(duì)象檢測(cè)和識(shí)別的有用技術(shù)。輪廓檢測(cè)并不是圖像分割的唯一算法,,還有很多其他算法,,例如目前最先進(jìn)的語義分割,、霍夫變換和 K-Means 分割。為了獲得更好的準(zhǔn)確性,,我們將遵循以下整個(gè)流程來成功檢測(cè)圖像中的輪廓:- 輸入圖像的標(biāo)準(zhǔn)化是它應(yīng)該始終是二進(jìn)制形式,。這就是為什么我們需要將其轉(zhuǎn)換為二進(jìn)制格式。
- 用于查找輪廓的 OpenCV 函數(shù)是 findContours(),。
首先,讓我們?yōu)檫@個(gè)項(xiàng)目安裝所有必需的依賴項(xiàng):pip3 install matplotlib opencv-python
import cv2 import matplotlib.pyplot as plt
# read the image image = cv2.imread('thumbs_up_down.jpg')
將其轉(zhuǎn)換為 RGB,,然后轉(zhuǎn)換為灰度:# convert to RGB image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # convert to grayscale gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
正如本教程前面提到的,我們要?jiǎng)?chuàng)建一個(gè)二值圖像,,這表明圖像的每個(gè)像素要么是黑色的,,要么是白色的。你可以將其進(jìn)行比較,,就像查找輪廓與檢測(cè)黑板上的白色物體更相似,。我們要找的物體是白色的,所以黑板需要是純黑色的,。# create a binary thresholded image _, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV) # show it plt.imshow(binary, cmap='gray') plt.show()
通過禁用像素(即將其設(shè)置為0)和啟用像素(即將其設(shè)置為225),,創(chuàng)建二進(jìn)制圖像。以下是輸出圖像:現(xiàn)在,,對(duì)于 OpenCV 來說,,這通常很容易檢測(cè)輪廓:# 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()
為了在不同的世界圖像上獲得良好的結(jié)果,,你需要調(diào)整閾值或執(zhí)行邊緣檢測(cè)。例如,,對(duì)于煎餅圖像,,我將邊緣減少到 127,結(jié)果如下:輪廓檢測(cè)和邊緣檢測(cè)的區(qū)別輪廓檢測(cè)的目標(biāo)是確定閉合物體的形狀,,特別是因?yàn)閷?duì)于具有相同顏色強(qiáng)度的連續(xù)點(diǎn),,尋找輪廓的方法是確定的,而邊緣檢測(cè)是通過檢測(cè)顏色強(qiáng)度內(nèi)的變化來進(jìn)行的,。對(duì)整個(gè)圖像進(jìn)行邊緣檢測(cè),,而僅對(duì)圖像內(nèi)的對(duì)象進(jìn)行輪廓檢測(cè)。結(jié)論這個(gè)項(xiàng)目是初學(xué)者級(jí)別的,,面向數(shù)據(jù)科學(xué)愛好者,。本文旨在讓你熟悉最簡(jiǎn)單的計(jì)算機(jī)視覺項(xiàng)目,,以增強(qiáng)你在計(jì)算機(jī)視覺方面的知識(shí)。
|