利用python實作Canny邊緣檢測,來定義我們要處理的圖檔之邊緣
首先,利用python讀取檔案,其中matplotlib.pyplot及matplotlib.image 為需要用到之程式庫,而exit-ramp.jpg 為要讀取之圖檔。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
image = mpimg.imread('exit-ramp.jpg')
plt.imshow(image)
對於圖檔,人可以很清楚透過眼睛查看車道線,但是要透過電腦視覺處理需要進一步轉換成灰階
import cv2 #bringing in OpenCV libraries
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) #grayscale conversion
plt.imshow(gray, cmap='gray')
針對圖檔,使用 python OpenCV Canny 函數如下:
edges = cv2.Canny(gray, low_threshold, high_threshold)
在這種情況下,Canny應用係輸入名為gray之灰階圖像,輸出將是另一個稱為edges圖像。而low_threshold和high_threshold代表邊緣檢測的門檻值。
此演算法係澳洲計算機科學家約翰·坎尼(John F. Canny)於1986年開發出來的一個多級邊緣檢測算法[1],首先檢測高閾值以上的強邊緣(強梯度)像素,並拒絕低於閾值的像素。接著,只要它們連接到強邊緣,就會包含值為low_threshold和high_threshold的像素。輸出邊緣是二進制圖像,其中白色像素描繪出檢測到之邊緣,而其他地方則為黑色。
而這些參數如何給定合理範圍?在我們的例子中,轉換為灰階圖,即是8位元圖像,因此每個像素可以採用2 ^ 8 = 256個可能的值。因此,像素值的範圍從0到255。
該範圍意味著衍生值(如素與像素之間的值差異)將在數十或數百的範圍內。因此,門檻值參數的合理範圍也將在數十到數百之間。
針對low_threshold與high_threshold的門檻值,John Canny原演算法提出者建議低到高比率為1:2或1:3。
在運行Canny檢測邊緣之前,我們需進行高斯平滑處理,是一種通過平均來抑制干擾和虛假漸變的方法(cv2.GaussianBlur)[2]。 實際上cv2.Canny()本身這函式處理內部已有應用高斯平滑方法,你也可以透過其他進一步的平滑方法來獲得不同的結果。
在這兒我們可選擇高斯平滑的kernel_size為任何奇數。kernel_size值較大意味著在更大的區域上進行平均或平滑。
#doing all the relevant imports
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2
image = mpimg.imread('exit-ramp.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
kernel_size = 3
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size), 0)
low_threshold = 1
high_threshold = 10
edges = cv2.Canny(blur_gray, low_threshold, high_threshold)
我們利用OpenCV函數Canny,處理名為blur_gray之高斯平滑且灰階圖像,並利用high_threshold和low_threshold之門檻值參數調整,檢測並提供清晰之邊緣。
plt.imshow(edges, cmap='Greys_r')
因此,我們產出一個經過canny及高斯平滑產出之灰階圖像
1.Canny邊緣檢測
2.OpenCV-GaussianBlur