opencv python:Canny邊緣提取


  • Canny是邊緣提取算法,在1986年提出的
  • 是一個很好的邊緣檢測器

Canny算法介紹

非最大信號抑制:

高低閾值連接:

example

import cv2 as cv
import numpy as np


# canny運算步驟:5步
# 1. 高斯模糊 - GaussianBlur
# 2. 灰度轉換 - cvtColor
# 3. 計算梯度 - Sobel/Scharr
# 4. 非極大值抑制
# 5. 高低閾值輸出二值圖像

# 非極大值抑制:
# 算法使用一個3×3鄰域作用在幅值陣列M[i,j]的所有點上;
# 每一個點上,鄰域的中心像素M[i,j]與沿着梯度線的兩個元素進行比較,
# 其中梯度線是由鄰域的中心點處的扇區值ζ[i,j]給出。
# 如果在鄰域中心點處的幅值M[i,j]不比梯度線方向上的兩個相鄰點幅值大,則M[i,j]賦值為零,否則維持原值;
# 此過程可以把M[i,j]寬屋脊帶細化成只有一個像素點寬,即保留屋脊的高度值。

# 高低閾值連接
# T1,T2為閾值,凡是高於T2的都保留,凡是低於T1的都丟棄
# 從高於T2的像素出發,凡是大於T1而且相互連接的都保留。最終得到一個輸出二值圖像
# 推薦高低閾值比值為T2:T1 = 3:1/2:1,其中T2高閾值,T1低閾值


def edge_demo(image):
    blurred = cv.GaussianBlur(image, (3, 3), 0)
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)

    grad_x = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
    grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)

    # edge_output = cv.Canny(grad_x, grad_y, 30, 150)
    edge_output = cv.Canny(gray, 50, 150)
    cv.imshow("gray", gray)
    cv.imshow("Canny demo", edge_output)


def main():
    src = cv.imread("../images/Crystal.jpg")
    cv.imshow("demo",src)

    edge_demo(src)
    cv.waitKey(0)  # 等有鍵輸入或者1000ms后自動將窗口消除,0表示只用鍵輸入結束窗口
    cv.destroyAllWindows()  # 關閉所有窗口


if __name__ == '__main__':
    main()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM