- OpenCV Python 教程
- OpenCV Python - 首頁
- OpenCV Python - 概述
- OpenCV Python - 環境配置
- OpenCV Python - 讀取影像
- OpenCV Python - 寫入影像
- OpenCV Python - 使用 Matplotlib
- OpenCV Python - 影像屬性
- OpenCV Python - 按位運算
- OpenCV Python - 形狀和文字
- OpenCV Python - 滑鼠事件
- OpenCV Python - 新增軌跡條
- OpenCV Python - 調整大小和旋轉
- OpenCV Python - 影像閾值化
- OpenCV Python - 影像濾波
- OpenCV Python - 邊緣檢測
- OpenCV Python - 直方圖
- OpenCV Python - 顏色空間
- OpenCV Python - 影像變換
- OpenCV Python - 影像輪廓
- OpenCV Python - 模板匹配
- OpenCV Python - 影像金字塔
- OpenCV Python - 影像加法
- OpenCV Python - 影像混合
- OpenCV Python - 傅立葉變換
- OpenCV Python - 捕捉影片
- OpenCV Python - 播放影片
- OpenCV Python - 從影片提取影像
- OpenCV Python - 從影像生成影片
- OpenCV Python - 人臉檢測
- OpenCV Python - 均值漂移/CamShift
- OpenCV Python - 特徵檢測
- OpenCV Python - 特徵匹配
- OpenCV Python - 數字識別
- OpenCV Python 資源
- OpenCV Python - 快速指南
- OpenCV Python - 資源
- OpenCV Python - 討論
OpenCV Python - 邊緣檢測
這裡的邊緣指的是影像中物體的邊界。OpenCV 有一個 **cv2.Canny()** 函式,透過實現 Canny 演算法來識別影像中各種物體的邊緣。
Canny 邊緣檢測演算法是由 John Canny 開發的。根據該演算法,物體的邊緣是透過執行以下步驟確定的:
第一步是減少影像中的噪聲畫素。這是透過應用 5X5 高斯濾波器來實現的。
第二步涉及找到影像的強度梯度。第一階段的平滑影像透過應用 Sobel 運算元進行濾波,以獲得水平和垂直方向的一階導數(Gx 和 Gy)。
均方根值給出邊緣梯度,導數的反正切比給出邊緣的方向。
$$\mathrm{邊緣梯度G\:=\:\sqrt{G_x^2+G_y^2}}$$
$$\mathrm{角度\:\theta\:=\:\tan^{-1}(\frac{G_{y}}{G_{x}})}$$
獲得梯度幅值和方向後,對影像進行全掃描以去除可能不構成邊緣的任何不需要的畫素。
下一步是使用 minval 和 maxval 閾值執行滯後閾值化。小於 minval 和 maxval 的強度梯度是非邊緣,因此被丟棄。介於兩者之間的畫素根據其連通性被視為邊緣點或非邊緣點。
所有這些步驟都由 OpenCV 的 cv2.Canny() 函式執行,該函式需要輸入影像陣列以及 minval 和 maxval 引數。
示例
以下是 Canny 邊緣檢測的示例。相應的程式如下所示:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('lena.jpg', 0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edges of original Image'), plt.xticks([]), plt.yticks([])
plt.show()
輸出
廣告