图像边缘侦测
这篇教学会介绍 OpenCV 三种图像边缘侦测的方法 ( Laplacian()、Sobel()、Canny() ),透过这些方法,可以针对图像进行边缘侦测,并将侦测的结果输出成为新的图像。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
Laplacian()
使用 OpenCV 的 Laplacian() 方法,可以针对“灰阶图片”,使用拉普拉斯运算子进行侦测边缘的转换,使用方法如下:
cv2.Laplacian(img, ddepth, ksize, scale)
# img 來源影像
# ddepth 影像深度,設定 -1 表示使用圖片原本影像深度
# ksize 運算區域大小,預設 1 ( 必須是正奇數 )
# scale 縮放比例常數,預設 1 ( 必須是正奇數 )
下面的例子会将蒙娜丽莎图片转灰阶后,再套用模糊化效果,最后使用 Laplacian() 方法产生边缘侦测的图像。
参考:图像模糊化
import cv2
img = cv2.imread('mona.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉成灰階
img = cv2.medianBlur(img, 7) # 模糊化,去除雜訊
output = cv2.Laplacian(img, -1, 1, 5) # 偵測邊緣
cv2.imshow('oxxostudio', output)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
Sobel()
使用 OpenCV 的 Sobel() 方法,可以针对“灰阶图片”,使用索伯运算子进行侦测边缘的转换,使用方法如下:
cv2.Sobel(img, ddepth, dx, dy, ksize, scale)
# img 來源影像
# dx 針對 x 軸抓取邊緣
# dy 針對 y 軸抓取邊緣
# ddepth 影像深度,設定 -1 表示使用圖片原本影像深度
# ksize 運算區域大小,預設 1 ( 必須是正奇數 )
# scale 縮放比例常數,預設 1 ( 必須是正奇數 )
下面的例子会将蒙娜丽莎图片转灰阶后,再套用模糊化效果,最后使用 Sobel() 方法产生边缘侦测的图像。
import cv2
img = cv2.imread('mona.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉成灰階
img = cv2.medianBlur(img, 7) # 模糊化,去除雜訊
output = cv2.Sobel(img, -1, 1, 1, 1, 7) # 偵測邊緣
cv2.imshow('oxxostudio', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
Canny()
使用 OpenCV 的 Canny() 方法,可以针对“灰阶图片”,使用 Canny 运算子进行侦测边缘的转换,使用方法如下:
cv2.Canny(img, threshold1, threshold2, apertureSize)
# img 來源影像
# threshold1 門檻值,範圍 0~255
# threshold2 門檻值,範圍 0~255
# apertureSize 計算梯度的 kernel size,預設 3
下面的例子会将蒙娜丽莎图片转灰阶后,再套用模糊化效果,最后使用 Canny() 方法产生边缘侦测的图像。
import cv2
img = cv2.imread('mona.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉成灰階
img = cv2.medianBlur(img, 7) # 模糊化,去除雜訊
output = cv2.Canny(img, 36, 36) # 偵測邊緣
print(output)
cv2.imshow('oxxostudio', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
影片的图像边缘侦测
延伸“读取并播放影片”文章的范例,在程序码中使用 Canny() 边缘侦测方法,就能将电脑镜头拍摄的画面,即时转换成只剩下边缘的图像。
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 轉成灰階
img = cv2.medianBlur(img, 7) # 模糊化,去除雜訊
img = cv2.Canny(img, 36, 36) # 偵測邊緣
cv2.imshow('oxxostudio', img)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注