iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0
AI & Data

當自動駕駛遇見AI系列 第 3

Day3-當自動駕駛遇見AI-Canny邊緣檢測(Canny edge detection)

目的

利用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)

https://ithelp.ithome.com.tw/upload/images/20181018/20107143029BMaILXV.jpg

圖檔轉灰階

對於圖檔,人可以很清楚透過眼睛查看車道線,但是要透過電腦視覺處理需要進一步轉換成灰階

import cv2  #bringing in OpenCV libraries
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) #grayscale conversion
plt.imshow(gray, cmap='gray')

https://ithelp.ithome.com.tw/upload/images/20181018/20107143eyS8IjtSX4.jpg

Canny邊緣檢測(Canny edge detector)應用說明

針對圖檔,使用 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值較大意味著在更大的區域上進行平均或平滑。

程式處理步驟

1.載入所需之程式庫

#doing all the relevant imports
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2

2.讀取圖檔並轉成灰階

image = mpimg.imread('exit-ramp.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

3.為高斯平滑/模糊定義核心大小

kernel_size = 3
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size), 0)

4.調整Canny之參數

low_threshold = 1
high_threshold = 10
edges = cv2.Canny(blur_gray, low_threshold, high_threshold)

我們利用OpenCV函數Canny,處理名為blur_gray之高斯平滑且灰階圖像,並利用high_threshold和low_threshold之門檻值參數調整,檢測並提供清晰之邊緣。

5.顯示成果圖片

plt.imshow(edges, cmap='Greys_r')

因此,我們產出一個經過canny及高斯平滑產出之灰階圖像
https://ithelp.ithome.com.tw/upload/images/20181018/20107143hTzU9RG8Cd.jpg

參考

1.Canny邊緣檢測
2.OpenCV-GaussianBlur


上一篇
Day2-當自動駕駛遇見AI-Project1-Finding Lane Lines
下一篇
Day4-當自動駕駛遇見AI-霍夫轉換(Hough transform)
系列文
當自動駕駛遇見AI30

尚未有邦友留言

立即登入留言