国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

opencv(23) Canny邊緣檢測(cè)流程(Canny算子)

這篇具有很好參考價(jià)值的文章主要介紹了opencv(23) Canny邊緣檢測(cè)流程(Canny算子)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Canny 邊緣檢測(cè)算法 是 John F. Canny 于 1986年開(kāi)發(fā)出來(lái)的一個(gè)多級(jí)邊緣檢測(cè)算法,也被很多人認(rèn)為是邊緣檢測(cè)的 最優(yōu)算法, 最優(yōu)邊緣檢測(cè)的三個(gè)主要評(píng)價(jià)標(biāo)準(zhǔn)是:

  1. 低錯(cuò)誤率: 標(biāo)識(shí)出盡可能多的實(shí)際邊緣,同時(shí)盡可能的減少噪聲產(chǎn)生的誤報(bào)。
  2. 高定位性: 標(biāo)識(shí)出的邊緣要與圖像中的實(shí)際邊緣盡可能接近。
  3. 最小響應(yīng): 圖像中的邊緣只能標(biāo)識(shí)一次。

1 最優(yōu)邊緣準(zhǔn)則

Canny 的目標(biāo)是找到一個(gè)最優(yōu)的邊緣檢測(cè)算法,最優(yōu)邊緣檢測(cè)的含義是:

  1. 最優(yōu)檢測(cè):算法能夠盡可能多地標(biāo)識(shí)出圖像中的實(shí)際邊緣,漏檢真實(shí)邊緣的概率和誤檢非邊緣的概率都盡可能?。?/li>
  2. 最優(yōu)定位準(zhǔn)則:檢測(cè)到的邊緣點(diǎn)的位置距離實(shí)際邊緣點(diǎn)的位置最近,或者是由于噪聲影響引起檢測(cè)出的邊緣偏離物體的真實(shí)邊緣的程度最?。?/li>
  3. 檢測(cè)點(diǎn)與邊緣點(diǎn)一一對(duì)應(yīng):算子檢測(cè)的邊緣點(diǎn)與實(shí)際邊緣點(diǎn)應(yīng)該是一一對(duì)應(yīng)。

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-848184.html

2 算法實(shí)現(xiàn)步驟詳解

Canny邊緣檢測(cè)算法可以分為以下5個(gè)步驟:

1)減噪聲:邊緣檢測(cè)對(duì)噪聲非常敏感,利用5*5高斯濾波器進(jìn)行操作

2)圖像梯度:利用sobel求X、Y的梯度,得到邊緣梯度和方向,梯度方向與邊緣垂直

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

3)應(yīng)用非極大值(Non_Maxinum Supperession)抑制,以消除邊緣檢測(cè)帶來(lái)的雜散影響。該點(diǎn)是8鄰域的邊緣梯度幅值最大值,則該點(diǎn)保留,否則就剔除

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

點(diǎn)A在垂直方向邊緣上,梯度方向正交于邊緣。點(diǎn)B與點(diǎn)C在梯度方向,檢測(cè)點(diǎn)A是否點(diǎn)B和點(diǎn)C形成局部極大值,如果是,進(jìn)入下階段,否則設(shè)置為0。

4)應(yīng)用雙閾值(Double-Thresold)檢測(cè)來(lái)確定真實(shí)和潛在的邊緣。

滯后閾值:梯度大于最大值是邊界,低于最小值是非邊界,剔除掉。介于最小值和最大值之間的邊界取決于連接性,與只是真實(shí)邊界相連為邊界,不相連予以剔除

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

5)通過(guò)抑制孤立的弱邊緣最終完成邊緣檢測(cè)。

邊緣A高于最大值,被認(rèn)為是真邊緣。邊緣C低于最大值,與邊緣A相連,被認(rèn)為是真邊緣。邊緣B沒(méi)有與真邊緣相連接,予以剔除。

第一步:消除噪聲

應(yīng)用高斯濾波來(lái)平滑(模糊)圖像,目的是去除噪聲。

高斯濾波器是將高斯函數(shù)離散化,將濾波器中對(duì)應(yīng)的橫縱坐標(biāo)索引代入到高斯函數(shù),從而得到對(duì)應(yīng)的值。

二維的高斯函數(shù)如下:其中 (x , y)為坐標(biāo), σ 為標(biāo)準(zhǔn)差。

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

不同尺寸的濾波器,得到的值也不同,下面是 cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué) ?濾波器的計(jì)算公式 :

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

常見(jiàn)的高斯濾波器大小為 5×5 , σ = 1.4 ?,其近似值為:

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

第二步:計(jì)算梯度強(qiáng)度和方向

接下來(lái),我們要尋找邊緣,即灰度強(qiáng)度變化最強(qiáng)的位置,(一道黑邊一道白邊中間就是邊緣,它的灰度值變化是最大的)。在圖像中,用梯度來(lái)表示灰度值的變化程度和方向。

常見(jiàn)方法采用Sobel濾波器【水平x和垂直y方向】在計(jì)算梯度和方向

1)水平方向的Sobel算子Gx:用來(lái)檢測(cè) y 方向的邊緣。

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

2)垂直方向的Sobel算子Gy:用來(lái)檢測(cè) x 方向的邊緣?邊緣方向和梯度方向垂直

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

3)采用下列公式計(jì)算梯度和方向:

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

梯度方向近似到四個(gè)可能角度之一(一般 0, 45, 90, 135)

第三步:非最大抑制

利用非最大抑制技術(shù)NMS來(lái)消除邊誤檢,這一步排除非邊緣像素, 僅僅保留了一些細(xì)線條(候選邊緣)。

原理:遍歷梯度矩陣上的所有點(diǎn),并保留邊緣方向上具有極大值的像素

這一步的目的是將模糊(blurred)的邊界變得清晰(sharp)。通俗的講,就是保留了每個(gè)像素點(diǎn)上梯度強(qiáng)度的極大值,而刪掉其他的值。對(duì)于每個(gè)像素點(diǎn),進(jìn)行如下操作:

1)將其梯度方向近似為以下值中的一個(gè)(0,45,90,135,180,225,270,315)(即上下左右和45度方向)

2)比較該像素點(diǎn),和其梯度方向正負(fù)方向的像素點(diǎn)的梯度強(qiáng)度

3)如果該像素點(diǎn)梯度強(qiáng)度最大則保留,否則抑制(刪除,即置為0)

??????? cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

例如下圖:點(diǎn) A 位于圖像邊緣垂直方向. 梯度方向 垂直于邊緣. 點(diǎn) B 和點(diǎn) C 位于梯度方向. 因此,檢查點(diǎn) A 和點(diǎn) B,點(diǎn) C,確定點(diǎn)A是否是局部最大值. 如果點(diǎn) A 是局部最大值,則繼續(xù)下一個(gè)階段;如果點(diǎn) A 不是局部最大值,則其被抑制設(shè)為0。

最后會(huì)保留一條邊界處最亮的一條細(xì)線

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

第四步:滯后閾值

最后一步,Canny 使用了滯后閾值,滯后閾值需要兩個(gè)閾值(高閾值和低閾值):

這個(gè)階段決定哪些邊緣是真正的邊緣,哪些邊緣不是真正的邊緣

經(jīng)過(guò)非極大抑制后圖像中仍然有很多噪聲點(diǎn)。Canny算法中應(yīng)用了一種叫雙閾值的技術(shù)。即設(shè)定一個(gè)閾值上界maxVal和閾值下界minVal,圖像中的像素點(diǎn)如果大于閾值上界則認(rèn)為必然是邊界(稱(chēng)為強(qiáng)邊界,strong edge),小于閾值下界則認(rèn)為必然不是邊界,兩者之間的則認(rèn)為是候選項(xiàng)(稱(chēng)為弱邊界,weak edge),需進(jìn)行進(jìn)一步處理——如果與確定為邊緣的像素點(diǎn)鄰接,則判定為邊緣;否則為非邊緣。

應(yīng)用雙閾值的方法來(lái)決定可能的(潛在的)邊界。

  1. 如果某一像素位置的幅值超過(guò) 閾值maxVal, 該像素被保留為邊緣像素。
  2. 如果某一像素位置的幅值小于 閾值minVal, 該像素被排除。
  3. 如果某一像素位置的幅值在兩個(gè)閾值之間,該像素僅僅在連接到一個(gè)高于 閾值的像素時(shí)被保留。

第五步:利用滯后技術(shù)來(lái)跟蹤邊界

這個(gè)階段是進(jìn)一步處理弱邊界。

大體思想是,和強(qiáng)邊界相連的弱邊界認(rèn)為是邊界,其他的弱邊界則被抑制。

由真實(shí)邊緣引起的弱邊緣像素將連接到強(qiáng)邊緣像素,而噪聲響應(yīng)未連接。為了跟蹤邊緣連接,通過(guò)查看弱邊緣像素及其8個(gè)鄰域像素,只要其中一個(gè)為強(qiáng)邊緣像素,則該弱邊緣點(diǎn)就可以保留為真實(shí)的邊緣。

3 cv2.Canny()函數(shù) Canny算子

函數(shù)原型:

edge=cv2.Canny(image,threshold1,threshold2[,edgs[,apertureSize[,L2gradient]]])

參數(shù):

  1. image - 輸入圖片,必須為單通道的灰度圖
  2. threshold1 和 threshold2 - 分別對(duì)應(yīng)于閾值 minVal 和 maxVal
  3. apertureSize - 用于計(jì)算圖片提取的 Sobel kernel 尺寸. 默認(rèn)為 3.
  4. L2gradient - 指定計(jì)算梯度的等式的參數(shù)。該參數(shù)默認(rèn)為 False。當(dāng)參數(shù)為 True 時(shí),其精度更高;采用 梯度計(jì)算公式(1)(2),

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

否則采用的梯度計(jì)算公式為:

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

4 示例: Canny邊緣檢測(cè)流程

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 第一步讀取圖片
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg', cv2.IMREAD_GRAYSCALE)


# 第二步:使用cv2.sobel進(jìn)行sobel算子計(jì)算
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0)
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1)
sobel_x = cv2.convertScaleAbs(sobel_x)
sobel_y = cv2.convertScaleAbs(sobel_y)
sobel_xy = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)

# 第三步:使用cv2.scharr進(jìn)行scharr算子計(jì)算
scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharr_x = cv2.convertScaleAbs(scharr_x)
scharr_y = cv2.convertScaleAbs(scharr_y)
scharr_xy = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)

# 第四步: 使用cv2.laplacian 拉普拉斯算子計(jì)算
lapkacian = cv2.Laplacian(img, cv2.CV_64F)
lapkacian = cv2.convertScaleAbs(lapkacian)

# 第五步: 使用cv2.Canny 算子計(jì)算
canny = cv2.Canny(img,100,200)

# 第六步:比較原圖和四種算子的效果
names = ['Original','sobel','scharr','lapkacian','canny']
images =? [img,sobel_xy,scharr_xy,lapkacian,canny]

plt.figure(figsize=(19.2,9))
for i in range(2):
??? for j in range(3):
??????? plt.subplot(2,3,i*3+j+1),plt.imshow(images[i*3+j])
??????? plt.title(names[i*3+j],fontsize=30), plt.xticks([]), plt.yticks([])
??????? num=i*3+j
??????? if num >= len(names)-1:
??????????? break

plt.show()

?運(yùn)行后結(jié)果如下:

cv2.canny(image, 100, 200),opencv,人工智能,計(jì)算機(jī)視覺(jué)

?

到了這里,關(guān)于opencv(23) Canny邊緣檢測(cè)流程(Canny算子)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Canny算子邊緣檢測(cè)原理講解及其完整C語(yǔ)言實(shí)現(xiàn)(不使用opencv)

    Canny算子邊緣檢測(cè)原理講解及其完整C語(yǔ)言實(shí)現(xiàn)(不使用opencv)

    作者:隊(duì)友調(diào)車(chē)我吹空調(diào) 日期:2023/05/17 版權(quán):遵循CC 4.0 BY-SA版權(quán)協(xié)議 這里是后期的筆者,本文算是筆者的學(xué)習(xí)筆記,主要是在單片機(jī)中使用的,再者就是由于某些原因,筆者不想使用opencv,因此嘗試跟著原理手搓了這份代碼,筆者也盡力將代碼寫(xiě)到最簡(jiǎn)和效率最優(yōu)了。然而

    2024年04月27日
    瀏覽(22)
  • 我在Vscode學(xué)OpenCV 圖像處理三(圖像梯度--邊緣檢測(cè)【圖像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 邊緣檢測(cè)】)

    我在Vscode學(xué)OpenCV 圖像處理三(圖像梯度--邊緣檢測(cè)【圖像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 邊緣檢測(cè)】)

    這里需要區(qū)分開(kāi)邊緣檢測(cè)和輪廓檢測(cè) 邊緣檢測(cè)并非萬(wàn)能,邊緣檢測(cè)雖然能夠檢測(cè)出邊緣,但邊緣是不連續(xù)的,檢測(cè)到的邊緣并不是一個(gè)整體。圖像輪廓是指將邊緣連接起來(lái)形成的一個(gè)整體,用于后續(xù)的計(jì)算。 OpenCV 提供了查找圖像輪廓的函數(shù) cv2.findContours(),該函數(shù)能夠查找圖

    2024年02月04日
    瀏覽(28)
  • 【C++】【Opencv】cv::Canny()邊緣檢測(cè)函數(shù)詳解和示例

    【C++】【Opencv】cv::Canny()邊緣檢測(cè)函數(shù)詳解和示例

    Canny邊緣檢測(cè)是一種流行的邊緣檢測(cè)算法,由John F. Canny在1986年開(kāi)發(fā)。它是一種多階段過(guò)程,包括噪聲濾波、計(jì)算圖像強(qiáng)度的梯度、非最大值抑制以及雙閾值檢測(cè)。本文通過(guò)函數(shù)原型解讀和示例對(duì)cv::Canny()函數(shù)進(jìn)行詳解,以幫助大家理解和使用。 Canny邊緣檢測(cè)的步驟如下: (

    2024年02月04日
    瀏覽(52)
  • python --opencv圖像處理Canny算子邊緣檢測(cè)(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr 算子、 LOG 算子)

    python --opencv圖像處理Canny算子邊緣檢測(cè)(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr 算子、 LOG 算子)

    邊緣檢測(cè)是基于灰度突變來(lái)分割圖像的常用方法,其實(shí)質(zhì)是提取圖像中不連續(xù)部分的特征。目前常見(jiàn)邊緣檢測(cè)算子有差分算子、 Roberts 算子、 Sobel 算子、 Prewitt 算子、 Log 算子以及 Canny 算子等。 其中, Canny 算子是由計(jì)算機(jī)科學(xué)家 John F. Canny 于 1986 年提出的一種邊緣檢測(cè)算子

    2024年04月12日
    瀏覽(26)
  • python實(shí)現(xiàn)Canny算子邊緣檢測(cè)算法

    python實(shí)現(xiàn)Canny算子邊緣檢測(cè)算法

    ? ? 邊緣檢測(cè)是一種將圖片中關(guān)鍵信息表現(xiàn)出來(lái)的一種圖片技術(shù),它的結(jié)果并不是字面意思上的獲取圖片邊緣,而是將圖片有用的信息勾勒出來(lái),類(lèi)似素描的結(jié)果,但是已經(jīng)去掉了很多信息。如下所示,一張?jiān)嫉膱D片是這樣的: ? ?? ? ? 通過(guò)邊緣檢測(cè)算法,我們最終得到

    2024年02月08日
    瀏覽(23)
  • openCV實(shí)戰(zhàn)-系列教程5:邊緣檢測(cè)(Canny邊緣檢測(cè)/高斯濾波器/Sobel算子/非極大值抑制/線性插值法/梯度方向/雙閾值檢測(cè) )、原理解析、源碼解讀
?????OpenCV實(shí)戰(zhàn)系列總目錄

    openCV實(shí)戰(zhàn)-系列教程5:邊緣檢測(cè)(Canny邊緣檢測(cè)/高斯濾波器/Sobel算子/非極大值抑制/線性插值法/梯度方向/雙閾值檢測(cè) )、原理解析、源碼解讀 ?????OpenCV實(shí)戰(zhàn)系列總目錄

    打印一個(gè)圖片可以做出一個(gè)函數(shù): Canny是一個(gè)科學(xué)家在1986年寫(xiě)了一篇論文,所以用自己的名字來(lái)命名這個(gè)檢測(cè)算法,Canny邊緣檢測(cè)算法這里寫(xiě)了5步流程,會(huì)用到之前《openCV實(shí)戰(zhàn)-系列教程》的內(nèi)容。? 使用高斯濾波器,以平滑圖像,濾除噪聲。 計(jì)算圖像中每個(gè)像素點(diǎn)的梯度強(qiáng)

    2024年02月11日
    瀏覽(23)
  • Canny邊緣檢測(cè)算子原理和matlab實(shí)現(xiàn)代碼

    ??圖像邊緣是圖像的重要信息,而Canny算子則是用于邊緣檢測(cè)的經(jīng)典算法。在用Canny算子進(jìn)行邊緣檢測(cè)之前必須有效地抑制噪聲,該算法使用的是高斯平滑濾波。接下來(lái)計(jì)算圖像中每一點(diǎn)的梯度向量,根據(jù)梯度向量可以得到梯度方向和梯度幅值。梯度方向在(-π,π]范圍內(nèi),

    2023年04月09日
    瀏覽(27)
  • Halcon邊緣檢測(cè)Sobel、Laplace和Canny算子

    Halcon邊緣檢測(cè)Sobel、Laplace和Canny算子

    提示:文章參考了網(wǎng)絡(luò)上其他作者的文章,以及相關(guān)書(shū)籍,如有侵權(quán),請(qǐng)聯(lián)系作者。 ???????除了閾值分割外,也可以通過(guò)檢測(cè)區(qū)域的邊緣得到目標(biāo)區(qū)域。區(qū)域的邊緣像素的灰度值往往會(huì)發(fā)生灰度上的突變,針對(duì)這些跳躍性的突變進(jìn)行檢測(cè)和計(jì)算,可以得到區(qū)域的邊緣輪廓

    2023年04月08日
    瀏覽(21)
  • Halcon經(jīng)典的邊緣檢測(cè)算子Sobel/Laplace/Canny

    關(guān)于邊緣檢測(cè),有許多經(jīng)典的算子,各大圖形處理庫(kù)都有各自的邊緣檢測(cè)算子,這里簡(jiǎn)要介紹幾種。 Sobel算子結(jié)合了高斯平滑和微分求導(dǎo)。它是一階導(dǎo)數(shù)的邊緣檢測(cè)算子,使用卷積核對(duì)圖像中的每個(gè)像素點(diǎn)做卷積和運(yùn)算,然后采用合適的閾值提取邊緣。Soble算子有兩個(gè)卷積核

    2024年01月22日
    瀏覽(21)
  • opencv基礎(chǔ)41-圖像梯度-sobel算子詳解cv2.Sobel()(邊緣檢測(cè)基礎(chǔ))

    opencv基礎(chǔ)41-圖像梯度-sobel算子詳解cv2.Sobel()(邊緣檢測(cè)基礎(chǔ))

    圖像梯度是用于描述圖像變化率的概念。在圖像處理中,梯度指的是圖像中每個(gè)像素的灰度值變化速率或方向。它常用于邊緣檢測(cè)和圖像特征提取。 一維圖像的梯度表示為函數(shù) f(x) 的導(dǎo)數(shù),而在二維圖像中,梯度是一個(gè)向量,包含兩個(gè)分量:水平方向和垂直方向的灰度變化率

    2024年02月14日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包