Python+Opencv实现无参数、全自动的Canny算法
目錄
- 一、什么是Canny邊緣檢測算法?
- 二、最優邊緣準則是什么?
- 三、Canny算法實現步驟
- 四、Canny算法在使用中的問題?
- 五、無參數、自動化Canny算法代碼實現
- 六、改進算法效果展示
- 七、問題探討
- 參考資料
- 注意事項
一、什么是Canny邊緣檢測算法?
??Canny邊緣檢測算子是John F. Canny于 1986 年開發出來的一個多級邊緣檢測算法。更為重要的是 Canny 創立了邊緣檢測計算理論(Computational theory of edge detection)解釋這項技術如何工作。
??通常情況下邊緣檢測的目的是在保留原有圖像屬性的情況下,顯著減少圖像的數據規模。目前有多種算法可以進行邊緣檢測,雖然Canny算法年代久遠,但可以說它是邊緣檢測的一種標準算法,而且仍在研究中廣泛使用。其效果如下圖所示:
二、最優邊緣準則是什么?
三、Canny算法實現步驟
具體的實現細節可以查看該鏈接。
四、Canny算法在使用中的問題?
??Canny算法的檢測效果很好,得到了廣泛的應用。它經常出現在一些算法的預處理階段,除此之外,很多計算機視覺庫中都集成了Canny算,代表性的包括Opencv,cv2.canny(image, lower, upper)是Opencv中的Canny算法的調用接口。**但是大家在調用的過程中都會遇到一個難題-lower和upper參數如何來設置呢?**很多人采取的方法是減少范圍不斷的去嘗試直到找到一個合適的閾值,但是這種方法費時費力,而且魯棒性較差。**你經常會發現,這個參數適用于這張圖片但是當你輸入另外一張圖片時效果就不好啦!**本文的主要目的就是來解決這個問題的!
五、無參數、自動化Canny算法代碼實現
# -*- coding: utf-8 -*- # 導入一些python包 import numpy as np import argparse import glob import cv2 import os# 定義auto_canny函數 def auto_canny(image, sigma=0.33):# 計算單通道像素強度的中位數v = np.median(image)# 選擇合適的lower和upper值,然后應用它們lower = int(max(0, (1.0 - sigma) * v))upper = int(min(255, (1.0 + sigma) * v))edged = cv2.Canny(image, lower, upper)return edged# 設置一些需要修改的參數 ap = argparse.ArgumentParser() ap.add_argument("-i", "--images", required=True, help="path to input dataset of images") args = vars(ap.parse_args())# 創建可視化文件夾 file_dir = "vis/" if not os.path.isdir(file_dir):os.makedirs(file_dir)# 遍歷文件夾中的每一張圖片 i = 0 img_names = glob.glob(args["images"] + "/*.jpg") for imagePath in img_names:# 讀取圖片image = cv2.imread(imagePath)# 灰度化處理gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 進行高斯模糊去噪blurred = cv2.GaussianBlur(gray, (3, 3), 0)# 分別使用寬閾值、窄閾值和自動確定的閾值進行測試wide = cv2.Canny(blurred, 10, 200)tight = cv2.Canny(blurred, 225, 250)auto = auto_canny(blurred)result = np.hstack([wide, tight, auto])i += 1save_name = "vis/" + str(i) + ".png"# 顯示并保存結果cv2.imshow("Original", image)cv2.imshow("Edges", result)cv2.imwrite(save_name, result)cv2.waitKey(0)運行方法- python auto_canny.py --image 測試文件夾名稱
六、改進算法效果展示
??上圖展示了該算法在多個測試圖片上面的檢測效果,第1列表示的是原始的輸入圖片;第2列表示使用寬閾值后的檢測效果;第3列表示使用窄閾值后的檢測效果;第4列表示使用自適用閾值后的檢測效果。我們可以發現,自動閾值的檢測效果在寬閾值和窄閾值之間,整體的效果基本滿足我們的要求,但是它帶來的好處是我們不在需要進行調參工作,哈哈哈。
七、問題探討
??其實本文的思路很簡單,主要是應用圖片中的統計信息,使用這些統計數據來消除手動調整閾值以進行Canny邊緣檢測。這個技巧可以節省你的時間參數調整-而且在應用這個功能之后你仍然可以得到一個很好的canny邊緣圖。具體的實現如下所示:
def auto_canny(image, sigma=0.33):# 計算單通道像素強度的中位數v = np.median(image)# 選擇合適的lower和upper值,然后應用它們lower = int(max(0, (1.0 - sigma) * v))upper = int(min(255, (1.0 + sigma) * v))edged = cv2.Canny(image, lower, upper)return edged參考資料
1、參考鏈接1
2、參考鏈接2
注意事項
[1] 該博客是本人原創博客,如果您對該博客感興趣,想要轉載該博客,請與我聯系(qq郵箱:1575262785@qq.com),我會在第一時間回復大家,謝謝大家的關注。
[2] 由于個人能力有限,該博客可能存在很多的問題,希望大家能夠提出改進意見。
[3] 如果您在閱讀本博客時遇到不理解的地方,希望您可以聯系我,我會及時的回復您,和您交流想法和意見,謝謝。
[4] 本文測試的圖片可以通過該鏈接進行下載。測試圖片鏈接- 提取碼:igzo
[5] 本人業余時間承接各種本科畢設設計和各種小項目,包括圖像處理(數據挖掘、機器學習、深度學習等)、matlab仿真、python算法及仿真等,有需要的請加QQ:1575262785詳聊!!!
總結
以上是生活随笔為你收集整理的Python+Opencv实现无参数、全自动的Canny算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq微云在哪里打开?qq微云能保存多久?
- 下一篇: 越南电动汽车厂商 VinFast 将美国