計算機視覺指的是,能夠用算法,讓計算機看到我們能看到的世界,比如深度、顏色、形狀和含義。我們將使用Python和OpenCV進行計算機視覺工作。 OpenCV代表開源計算機視覺。OpenCV包含您可以使用的豐富函數庫。 OpenCV庫有很好的文檔記錄,所以如果你對特定函數的參數或其他內容感到困惑,可以在opencv.org上找到大量信息。
Canny Edge Detection,邊緣檢測,用於檢測出圖像物體的邊界(boundaries)。
具體步驟:
首先,將圖像轉為灰度(grayscale)。每個像素點的灰度數值在[0,255]區間,行車線的顏色通常與路面有較大差異,我們可以利用路面到行車線的顏色突變來進行檢測。
然后,計算梯度(gradient)。每個像素的亮度對應是該點梯度強度;通過追蹤出最大梯度下的像素得到邊緣。通過辨別出邊沿,得到物體的形狀。
通過檢測到物體邊界,進而得到該物體形狀。
那邊界(edge)是什么呢?
OpenCV的Canny function 需要的參數如下:edges=cv2.Canny(gray,low_threshold,higy_threshold)
輸入灰度圖,輸出邊界圖。低閾值和高閾值用於確定要檢測出的邊界的強度。可以將邊緣的強度大小視為由圖像中相鄰像素值的差異大小。就是灰度的強度。
看一張灰度圖像,我看到亮點,黑點和其間的所有灰色。亮度的快速變化是我們找到邊緣的地方。
我們的圖像只是x和y的數學函數,所以我們可以對其進行數學運算,就像其他函數一樣。
例如,我們可以采用它的導數,它只是這個函數變化的度量。一個小的派生意味着小的變化。 大派生,很大的變化。 圖像是二維的,所以同時采用關於x和y的導數是有意義的。 這被稱為漸變,在計算它時,我們測量的是圖像中每個點像素值的變化速度以及它們變化最快的方向。
計算漸變給了我們厚重的邊緣。 使用Canny算法,我們將精簡這些邊以找出最強梯度之后的各個像素。然后,我們將這些較強的邊擴展到包含像素,直到調用Canny函數時定義的較低閾值。
注意! 圖像的原點(x = 0,y = 0)的標准位置在左上角,y值向下增加,x向右增加。 這看起來可能很奇怪,但如果您將圖像視為矩陣,則“00”元素位於左上角是有意義的。
我正在通過這張圖片繪制橫截面(cross section中灰度值變化曲線)。 圖像中A到F中哪些區域最有可能被識別為邊緣? 答案:A、C、E。(灰度變化最大的區域)
步驟:
1.讀取圖像;
2.轉化為灰度;
3.利用canny邊緣檢測cv2.Canny(gray, low_threshold, high_threshold)
,檢測灰度圖
該算法將首先檢測high_threshold之上的強邊緣(強梯度)像素,並拒絕低於low_threshold的像素。 接下來,只要連接到強邊緣,包含low_threshold和high_threshold之間值的像素將被包含在內。 輸出邊緣是一個二值圖像,其中白色像素描繪出檢測到的邊緣,而其他位置則為黑色。具體可見canny文檔。
轉換為灰度已經給我們留下了8位圖像,所以每個像素可以取2 ^ 8 = 256個可能的值。 因此,像素值的范圍從0到255。這個范圍意味着衍生物(本質上,每個像素之間的值差異)將在數十或數百的范圍內。 所以,您的閾值參數的合理范圍也將在幾十到幾百。就低閾值與高閾值的比率而言,John Canny本人推薦1:2或1:3的低到高比例。
4.在運行Canny之前,我們還將包括高斯平滑,這實際上是一種通過平均來抑制噪聲和雜散梯度的方法(查看GaussianBlur的OpenCV文檔)。 cv2.Canny()實際上在內部應用高斯平滑,但我們在這里包含它,因為通過應用更多的平滑可以得到不同的結果(並且它不是cv2.Canny()內的可變參數!)。您可以選擇高斯平滑的kernel_size作為任何奇數。更大的kernel_size意味着在更大的區域上進行平均或平滑。
5.在這里,我稱OpenCV函數Canny在一個名為blur_gray的高斯平滑灰度圖像上,並檢測了高閾值和低閾值梯度上的閾值。
1 import matplotlib.pyplot as plt 2 import matplotlib.image as mpimg 3 import cv2 #bringing in OpenCV libraries 4 5 #read in the image and convert to grayscale 6 image = mpimg.imread('E:/spyder/a/a/exit-ramp.jpg') 7 gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) #grayscale conversion 8 #define a kernel size for Gaussian smoothing/blurring 9 #note:this step is optional as cv2.canny() applies a 5*5 Gaussian internally 10 kernel_size=3 11 blur_gray=cv2.GaussianBlur(gray,(kernel_size,kernel_size),0) 12 13 #define parameters for canny and run it 14 #note:if you try running this code you might want to change these! 15 low_threshold=100 16 high_threshold=250 17 edges=cv2.Canny(gray,low_threshold,high_threshold) 18 19 #display the image 20 plt.imshow(edges, cmap='Greys_r')