1. 程式人生 > >利用Canny邊緣檢測運算元進行邊緣檢測的原理及OpenCV程式碼實現

利用Canny邊緣檢測運算元進行邊緣檢測的原理及OpenCV程式碼實現

Canny運算元是John Canny在1986年發表的論文中首次提出的邊緣檢測運算元,該運算元檢測效能比較好,應用廣泛。

Canny運算元進行邊緣檢測的原理和步驟如下

⑴消除噪聲。邊緣檢測的演算法主要是基於影象強度的一階和二階微分操作,但導數通常對噪聲很敏感,邊緣檢測演算法常常需要根據影象源的資料進行預處理操作,因此採用濾波器來改善與噪聲有關的邊緣檢測效能,比如在進行邊緣檢測前,可以對原始資料先作高斯濾波處理。其實不僅對噪聲,如果不做濾波平滑處理,原圖片中不是邊緣但是灰度變化頻率較高的部分也容易被認為是邊緣,這樣導致了邊緣檢測效能的下降。

⑵計算梯度的幅度與方向。OpenCV中的Canny函式是使用Sobel卷積核來計算梯度的幅度與方向的。計算出的幅度與方向作為後面提取影象邊緣的原始資料。

⑶非極大值抑制。非極大值抑制的目的是剔除第⑵部中計算出來的結果中的大部分非邊緣點。其原理是通過畫素的八鄰域來判斷要不要將這個畫素置為邊緣點,如果不置為邊緣點,那麼就置為背景色。判斷的方法如下:

①判斷範圍是畫素的八鄰域,所以是區域性最優判斷法;

②判斷的標準是如果某個畫素在其八鄰域內,既是最大值,梯度值也最大,那麼可判斷該點為畫素邊緣點,否則就不是。如何判斷呢?

首先,梯度值的判斷是很好判斷的,用邊緣檢測微分運算元得到的結果直接比較就可以了,但是最大值的判斷可不是隻比較其旁邊的八個點哦,還要比較另外兩個點,詳情如下:

如果已經判斷出上圖中的C點比其旁邊的8個點的畫素值都大,那麼接下來判斷上圖中dTmp1和dTmp2的值是否也小於C點的值,那麼dTmp1和dTmp2的值怎麼求呢?上圖中藍色的線條方向為C點的梯度方向,這樣就可以確定其區域性的最大值肯定分佈在這條線上,也即除了C點外,梯度方向的交點dTmp1和dTmp2這兩個點的值也可能會是區域性最大值。因此,判斷C點灰度與這兩個點灰度大小即可判斷C點是否為其鄰域內的區域性最大灰度點。如果經過判斷,C點灰度值小於這兩個點中的任一個,那就說明C點不是區域性極大值,那麼則可以排除C點為邊緣。

⑷用滯後閾值演算法求解影象邊緣。上一步對邊緣檢測運算元的結果進行了非極大值抑制,接下來我們用二值化的方法來求解影象邊緣。單閾值處理邊緣效果不好,所以Cannny演算法中採用滯後閾值法求解。滯後閾值法需要設定一個高閾值和一個低閾值,解後按如下法則進行:

第一,如果某一畫素位置的梯度幅值超過高閾值,則畫素被保留為邊緣畫素;

第二,如果某一畫素位置的梯度幅值小於低閾值,則畫素被排除;

第三,如果某一畫素位置的幅值在兩個閾值之間,該畫素僅僅在連線到一個高於高閾值的畫素時被保留。

在以上的法則中,推薦的高閾值與低閾值比在2:1到3:1之間!

通過消除噪聲、計算梯度幅度與方向、非極大值抑制及用滯後閾值演算法求解影象邊緣四個步驟就可實現Canny邊緣檢測。

Canny函式原型如下:

void Canny( InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false );

Image為輸入影象,單通道8bit;

edges為輸出影象,與輸入影象同類型同尺寸;

 threshold1為滯後閾值演算法的低閾值;

 threshold2為為滯後閾值演算法的高閾值;

apertureSize為Sobel運算元的視窗(卷積核)階數;

L2gradient表示是否使用L2範數來計算影象梯度幅值。

以下是使用函式Canny實現影象邊緣檢測的程式碼:

相關推薦

利用Canny邊緣檢測運算元進行邊緣檢測原理OpenCV程式碼實現

Canny運算元是John Canny在1986年發表的論文中首次提出的邊緣檢測運算元,該運算元檢測效能比較好,應用廣泛。 Canny運算元進行邊緣檢測的原理和步驟如下: ⑴消除噪聲。邊緣檢測的演算法主要是基於影象強度的一階和二階微分操作,但導數通常對噪聲很敏感,邊緣檢測

利用霍夫變換做直線檢測原理OpenCV程式碼實現

說白了,以直線檢測為例,霍夫變換實際上就是把使每個畫素座標點經過變換都變成都直線特質有貢獻的統一度量(這種度量以我目前的理解與笛卡爾(極坐系)並無區別,即極半徑和極角),並對轉換後的度量進行累計(可以理解為投票),當一個波峰出現時候,說明有直線存在。如果要了解更詳細的,大

影象特徵檢測描述(一):SIFT、SURF、ORB、HOG、LBP特徵的原理概述OpenCV程式碼實現

什麼叫特徵檢測?就是檢測影象中目標的特徵唄,所謂特徵,不管你怎麼旋轉目標,離目標遠近,它的特徵都應不變才對,這兩個特性稱為叫旋轉不變性和尺度不變性。當然還有其它特徵,如光照不一樣,也不應該變化嘛,只是旋轉不變性和尺度不變性是最基本的兩個要求。 對特徵的描述有很多種方法和運算

Canny邊緣檢測演算法原理C語言實現詳解

Canny運算元是John Canny在1986年提出的,那年老大爺才28歲,該文章發表在PAMI頂級期刊上的(1986. A computational approach to edge detection. IEEE Transactions on Pattern Analy

Sobel邊緣檢測演算法OpenCV函式實現

轉自https://www.cnblogs.com/herenzhiming/articles/6526741.html  https://blog.csdn.net/qaz_wz/article/details/79052246 演算法原理 索貝爾運算元(So

霍夫變換直線檢測houghlinesopencv實現分析

導讀: 1. houghlines的演算法思想 2. houghlines實現需要考慮的要素 3. houghlines的opencv實現,程式碼分析 4. houghlines的效率分析,改進 1. houghlines的演算法思想 檢測直線,houghlines標準演算

MTCNN 人臉檢測論文解讀,tensorflow程式碼實現

MTCNN簡介 《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》論文解讀。 相比於R-CNN系列通用檢測方法,本文更加針對人臉檢測這一專門的任務,速度和精度都有足夠的提升。R-CNN,

Hough檢測直線原理c++程式碼

函式功能:檢測影象中的線段 函式原型: CvSeq* cvHoughLines2(   CvArr* image,   void* line_storage,   int method,   double rho,   double theta,   int threshold,   double param

HOG特徵檢測原理opencv API呼叫

1.預處理 用於計算HOG特徵的影象一般都是選擇大小為64x128畫素大小。在opencv中可以直接呼叫resize()來完成,得到src。當然也有先裁剪在resize()的操作方式。這裡也可以採用gamma correction對src進行處理,但是從Dalal和Tr

利用在圖片上中新增文字最終生成海報的程式碼實現

思想和行動,總要有一個不能落後於人。 現在基本的輸入工程,互動功能已經實現,到了最重要的一個功能,就是把文字和圖片實現一個重合。 具體怎麼實現我上網查了一下,發現了通過<canvas>標籤利用js可以實現這個功能。 什麼是 Canvas? HTML5

梯度與邊緣檢測常用運算元:Roberts、Prewitt、Sobel、LOG,Canny、Lapacian運算元

原文:https://blog.csdn.net/swj110119/article/details/51777422 原文:https://blog.csdn.net/gdut2015go/article/details/46779251 幾種邊緣檢測運算元的比較Robert

【轉】Python+opencv利用sobel進行邊緣檢測(細節講解)

#! usr/bin/env python # coding:utf-8 # 2018年7月2日06:48:35 # 2018年7月2日23:11:59 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2

Python OpenCV _3形態學處理(腐蝕膨脹,開閉運算,以及利用形態學進行邊緣角點檢測

Python OpenCV這個初級影象處理系列是參考他人的文章寫的,有些地方做了一些改動,沒有太多理論,側重程式碼實現,主要目的是將這些基本操作程式碼系統地梳理一遍,也是為了以後能快速查詢。 此係列原始碼在我的GitHub裡:https://github.com/yeyujujishou19/P

Canny邊緣檢測運算元原理

canny運算元是影象處理中比較常用的演算法,之前曾用canny來進行邊緣檢測,方便接下來的用Hough對影象進行處理,其中Canny運算元的演算法原理中有好多基本的概率都很重要,為了溫故所以寫篇Canny,有不做和錯誤的地方歡迎指徵。 首先介紹一下Canny對邊緣檢測質量

影象處理:Robert邊緣檢測運算元

事情比較多比較雜,早點把學校的事弄完吧,好久沒寫部落格了,最近計算機前沿這門課,老師要佈置課題,大部分是Verilog HDL程式設計,腦殼疼,硬體太煩, 不過還好,可以選擇其他方向的 哈哈,api學習還是有必要的,不必造輪子,不過,要有造輪子的能力,具體分的課題是邊緣檢測演算法的

LoG、DoG運算元--邊緣檢測運算元(噪聲不敏感)

1、LoG運算元 Laplace運算元是一種優秀的邊緣檢測運算元,通過對影象求二階導數,然後通過二階導數的0交叉點來實現邊緣檢測。因為Laplace運算元對噪聲敏感,故可在進行Laplace計算之前用高斯濾波來進行降噪處理,這樣就形成了拉普拉斯高斯運算元LoG(Laplace of Ga

影象處理常用邊緣檢測運算元總結

       不同影象灰度不同,邊界處一般會有明顯的邊緣,利用此特徵可以分割影象。需要說明的是:邊緣和物體間的邊界並不等同,邊緣指的是影象中畫素的值有突變的地方,而物體間的邊界指的是現實場景中的存在於物體之間的邊界。有可能有邊緣的地方並非邊界,也有可能邊界的地方並

影象邊緣檢測——幾種影象邊緣檢測運算元的學習python 實現

  本文學習利用python學習邊緣檢測的濾波器,首先讀入的圖片程式碼如下: import cv2 from pylab import * saber = cv2.imread("construction.jpg") saber = cv2.cvtColor(saber,cv2.COLOR_BGR2RG

影象處理演算法4——Sobel 邊緣檢測運算元

Sobel 運算元是一個離散微分運算元 (discrete differentiation operator)。 它結合了高斯平滑和微分求導,用來計算影象灰度函式的近似梯度。     影象邊緣,相素值會發生顯著的變化了。表示這一改變的一個方法是使用 導數 。 梯度值的大

OpenCV學習筆記(14):形態學濾波對影象進行邊緣角點檢測

</pre><pre name="code" class="cpp">#include "stdafx.h" #include<opencv2/opencv.hpp> using namespace cv; class MorphoFe