日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV查找边缘

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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查找边缘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。