OpenCV查找边缘
2019-04-11 by 崔斐然
先展示效果,看看是不是和你的需求一致:
邊緣檢測的一般步驟:
1、濾波——消除噪聲
2、增強——使邊闊更為明顯
3、檢測——選出邊緣點
邊緣檢測步驟:使用高斯濾波器對圖像進行去噪、計算梯度、在邊緣上使用非最大抑制(NMS)、在檢測到的邊緣上使用雙(double)閾值去除假陽性,最后分析所有的邊緣及其之間的連接,以保留真正的邊緣并消除不明顯的邊緣。
使用的函數主要有CV2.GaussianBlur,cv2.cvtColor, cv2.Canny
首先加載需要轉換的圖像
src = cv2.imread(' <path>')如果圖片比較大的話可以使用cv2.resize函數對圖像縮放
img=cv2.resize(img, (int(width*0.12), int(height*0.12)));色彩基礎
灰度色彩空間是通過去除彩色信息來將其轉換成灰階,灰度色彩空間對中間處理特別有效,比如人臉檢測。
BGR即藍-綠-紅色彩空間,每一個像素點都由一個三元數組來表示,分別代表藍、綠、紅三種顏色。
HSV,H(Hue)是色調, S(Saturation)是飽和度, V(Value)表示黑暗的程度(或光譜另一端的明亮程度)
作者:深思海數_willschang
鏈接:https://www.jianshu.com/p/bfd5dd2566bb
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
這些濾濾函數會將非邊緣區域轉為黑色,將邊緣區域轉為白色或其他飽和的顏色。但它們又很容易將噪聲錯誤地識別為邊緣。解決方案就是在找到邊緣之前對圖像進行模糊處理。OpenCV提供的模糊濾波函數,如blur(),medianBlur()以及GaussianBlur()。
高斯濾波
cv2.GaussianBlur
blurred = cv2.GaussianBlur(image, (3, 3), 0)高斯濾波參數說明如下
InputArray src-----源圖像OutputArray dst-----目標圖像Size ksize----高斯內核大小,其中ksize.width和ksize.height可以不同,但是必須為正數和奇數,也可為零,均有sigma計算而來。double sigmaX----表示高斯函數在X方向的標準偏差double sigmaY---- 表示高斯函數在Y方向的標準偏差若sigma為零,就將它設為sigmaX,如果兩者均為零,就由ksize.width和ksize.height計算出來。int borderType -----用于推斷圖像外部像素的某種邊界模式。默認值 BORDER_DEFAULT */灰度化處理
gray = cv2.cvtColor(blurred, cv2.COLOR_RGB2GRAY)cv2.cvtColor參數見:https://www.aiuai.cn/aifarm365.html
Canny邊緣檢測
Canny邊緣檢測算法被很多人推崇為當今最優秀的邊緣檢測算法。
edge_output = cv2.Canny(gray, 50, 150)canny的參數:
第一個參數是輸入圖像,第二個和第三個參數是minVal和maxVal 函數原型是這樣的關于閥值
4.滯后閾值: 最后一步,Canny 使用了滯后閾值,滯后閾值需要兩個閾值(高閾值和低閾值):
a. 如果某一像素位置的幅值超過 高 閾值, 該像素被保留為邊緣像素。b. 如果某一像素位置的幅值小于 低 閾值, 該像素被排除。c. 如果某一像素位置的幅值在兩個閾值之間,該像素僅僅在連接到一個高于 高 閾值的像素時被保留。Canny 推薦的 高:低 閾值比在 2:1 到3:1之間。最終代碼
#Canny邊緣提取 import cv2 def edge_demo(image):blurred = cv2.GaussianBlur(image, (3, 3), 0)gray = cv2.cvtColor(blurred, cv2.COLOR_RGB2GRAY)edge_output = cv2.Canny(gray, 50, 150)# cv2.resizeWindow("Canny Edge", 600, 600);cv2.imshow("Canny Edge", edge_output)# 添加遮罩層dst = cv2.bitwise_and(image, image, mask= edge_output)# cv2.resizeWindow("Color Edge", 600, 600);# cv2.namedWindow('input_image', 0)# 顯示邊緣cv2.imshow("Color Edge", dst)if __name__ == '__main__':src = cv2.imread('cannytest.jpg')height, width = src.shape[:2]src=cv2.resize(src, (int(width*0.12), int(height*0.12)));cv2.imshow("src", src)# 設置為WINDOW_NORMAL可以任意縮放# cv2.namedWindow('input_image', cv2.WINDOW_NORMAL)# cv2.resizeWindow("input_image", 600, 600);# cv2.imshow('input_image', src)edge_demo(src)cv2.waitKey(0)cv2.destroyAllWindows()總結
以上是生活随笔為你收集整理的OpenCV查找边缘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于机器学习的捡球机器人设计与实现(探索
- 下一篇: 解决树莓派Virtualenv虚拟环境下