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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python+Opencv实现无参数、全自动的Canny算法

發布時間:2023/12/15 python 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python+Opencv实现无参数、全自动的Canny算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 一、什么是Canny邊緣檢測算法?
    • 二、最優邊緣準則是什么?
    • 三、Canny算法實現步驟
    • 四、Canny算法在使用中的問題?
    • 五、無參數、自動化Canny算法代碼實現
    • 六、改進算法效果展示
    • 七、問題探討
    • 參考資料
    • 注意事項

一、什么是Canny邊緣檢測算法?

??Canny邊緣檢測算子是John F. Canny于 1986 年開發出來的一個多級邊緣檢測算法。更為重要的是 Canny 創立了邊緣檢測計算理論(Computational theory of edge detection)解釋這項技術如何工作。
??通常情況下邊緣檢測的目的是在保留原有圖像屬性的情況下,顯著減少圖像的數據規模。目前有多種算法可以進行邊緣檢測,雖然Canny算法年代久遠,但可以說它是邊緣檢測的一種標準算法,而且仍在研究中廣泛使用。其效果如下圖所示:

二、最優邊緣準則是什么?

  • 最優檢測:算法能夠盡可能多地標識出圖像中的實際邊緣,漏檢真實邊緣的概率和誤檢非邊緣的概率都盡可能小;
  • 最優定位準則:檢測到的邊緣點的位置距離實際邊緣點的位置最近,或者是由于噪聲影響引起檢測出的邊緣偏離物體的真實邊緣的程度最小;
  • 檢測點與邊緣點一一對應:算子檢測的邊緣點與實際邊緣點應該是一一對應。為了滿足這些要求 Canny 使用了變分法(calculus of variations),這是一種尋找優化特定功能的函數的方法。最優檢測使用四個指數函數項表示,但是它非常近似于高斯函數的一階導數
  • 三、Canny算法實現步驟

  • 應用高斯濾波來平滑圖像,目的是去除噪聲;
  • 計算圖像的強度梯度(intensity gradients);
  • 應用非最大抑制(non-maximum suppression)技術來消除邊誤檢(本來不是但檢測出來是);
  • 應用雙閾值的方法來決定可能的(潛在的)邊界;
  • 利用滯后技術來跟蹤邊界。
  • 具體的實現細節可以查看該鏈接。

    四、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算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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