最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python圖像銳化與邊緣檢測之Scharr,Canny,LOG算子詳解

 更新時間:2022年12月21日 16:03:02   作者:Eastmount  
圖像銳化和邊緣檢測主要包括一階微分銳化和二階微分銳化,本文主要講解常見的圖像銳化和邊緣檢測方法,即Scharr算子、Canny算子和LOG算子,需要的可以參考一下

一.Scharr算子

由于Sobel算子在計算相對較小的核的時候,其近似計算導數的精度比較低,比如一個3×3的Sobel算子,當梯度角度接近水平或垂直方向時,其不精確性就越發(fā)明顯。Scharr算子同Sobel算子的速度一樣快,但是準確率更高,尤其是計算較小核的情景,所以利用3×3濾波器實現圖像邊緣提取更推薦使用Scharr算子。

Scharr算子又稱為Scharr濾波器,也是計算x或y方向上的圖像差分,在OpenCV中主要是配合Sobel算子的運算而存在的,其濾波器的濾波系數如下:

Scharr算子的函數原型如下所示,和Sobel算子幾乎一致,只是沒有ksize參數。

dst = Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]])

  • – src表示輸入圖像
  • – dst表示輸出的邊緣圖,其大小和通道數與輸入圖像相同
  • – ddepth表示目標圖像所需的深度,針對不同的輸入圖像,輸出目標圖像有不同的深度
  • – dx表示x方向上的差分階數,取值1或 0
  • – dy表示y方向上的差分階數,取值1或0
  • – scale表示縮放導數的比例常數,默認情況下沒有伸縮系數
  • – delta表示將結果存入目標圖像之前,添加到結果中的可選增量值
  • – borderType表示邊框模式,更多詳細信息查閱BorderTypes

Scharr算子的實現代碼如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
 
#讀取圖像
img = cv2.imread('luo.png')
lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#灰度化處理圖像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
# Scharr算子
x = cv2.Scharr(grayImage, cv2.CV_32F, 1, 0) #X方向
y = cv2.Scharr(grayImage, cv2.CV_32F, 0, 1) #Y方向
absX = cv2.convertScaleAbs(x)       
absY = cv2.convertScaleAbs(y)
Scharr = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']

#顯示圖形
titles = ['原始圖像', 'Scharr算子']  
images = [lenna_img, Scharr]  
for i in range(2):  
   plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

其運行結果如圖1所示:

二.Cann算子

John F.Canny于1986年發(fā)明了一個多級邊緣檢測算法——Canny邊緣檢測算子,并創(chuàng)立了邊緣檢測計算理論(Computational theory of edge detection),該理論有效地解釋了這項技術的工作理論。

邊緣檢測通常是在保留原有圖像屬性的情況下,對圖像數據規(guī)模進行縮減,提取圖像邊緣輪廓的處理方式。Canny算法是一種被廣泛應用于邊緣檢測的標準算法,其目標是找到一個最優(yōu)的邊緣檢測解或找尋一幅圖像中灰度強度變化最強的位置。最優(yōu)邊緣檢測主要通過低錯誤率、高定位性和最小響應三個標準進行評價。Canny算子的實現步驟如下:

第一步,使用高斯平滑(如公式2所示)去除噪聲。

第二步,按照Sobel濾波器步驟計算梯度幅值和方向,尋找圖像的強度梯度。先將卷積模板分別作用x和y方向,再計算梯度幅值和方向,其公式如下所示。梯度方向一般取0度、45度、90度和135度四個方向。

第三步,通過非極大值抑制(Non-maximum Suppression)過濾掉非邊緣像素,將模糊的邊界變得清晰。該過程保留了每個像素點上梯度強度的極大值,過濾掉其他的值。對于每個像素點,它進行如下操作:

  • 將其梯度方向近似為以下值中的一個,包括0、45、90、135、180、225、270和315,即表示上下左右和45度方向;
  • 比較該像素點和其梯度正負方向的像素點的梯度強度,如果該像素點梯度強度最大則保留,否則抑制(刪除,即置為0)。其處理后效果如圖2所示,左邊表示梯度值,右邊表示非極大值抑制處理后的邊緣。

第四步,利用雙閾值方法來確定潛在的邊界。經過非極大抑制后圖像中仍然有很多噪聲點,此時需要通過雙閾值技術處理,即設定一個閾值上界和閾值下界。圖像中的像素點如果大于閾值上界則認為必然是邊界(稱為強邊界,strong edge),小于閾值下界則認為必然不是邊界,兩者之間的則認為是候選項(稱為弱邊界,weak edge)。經過雙閾值處理的圖像如圖3所示,左邊為非極大值抑制處理后的邊緣,右邊為雙閾值技術處理的效果圖。

第五步,利用滯后技術來跟蹤邊界。若某一像素位置和強邊界相連的弱邊界認為是邊界,其他的弱邊界則被刪除。
在OpenCV中,Canny()函數原型如下所示:

edges = Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

  • – image表示輸入圖像
  • – edges表示輸出的邊緣圖,其大小和類型與輸入圖像相同
  • – threshold1表示第一個滯后性閾值
  • – threshold2表示第二個滯后性閾值
  • – apertureSize表示應用Sobel算子的孔徑大小,其默認值為3
  • – L2gradient表示一個計算圖像梯度幅值的標識,默認值為false

Canny算子的邊緣提取實現代碼如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
 
#讀取圖像
img = cv2.imread('luo.png')
lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#灰度化處理圖像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#高斯濾波降噪
gaussian = cv2.GaussianBlur(grayImage, (3,3), 0)
 
#Canny算子
Canny = cv2.Canny(gaussian, 50, 150) 

#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']

#顯示圖形
titles = ['原始圖像', 'Canny算子']  
images = [lenna_img, Canny]  
for i in range(2):  
   plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

其運行結果如圖4所示:

三.LOG算子

LOG(Laplacian of Gaussian)邊緣檢測算子是David Courtnay Marr和Ellen Hildreth在1980年共同提出的,也稱為Marr & Hildreth算子,它根據圖像的信噪比來求檢測邊緣的最優(yōu)濾波器。該算法首先對圖像做高斯濾波,然后再求其拉普拉斯(Laplacian)二階導數,根據二階導數的過零點來檢測圖像的邊界,即通過檢測濾波結果的零交叉(Zero crossings)來獲得圖像或物體的邊緣。

LOG算子綜合考慮了對噪聲的抑制和對邊緣的檢測兩個方面,并且把Gauss平滑濾波器和Laplacian銳化濾波器結合了起來,先平滑掉噪聲,再進行邊緣檢測,所以效果會更好。 該算子與視覺生理中的數學模型相似,因此在圖像處理領域中得到了廣泛的應用。它具有抗干擾能力強,邊界定位精度高,邊緣連續(xù)性好,能有效提取對比度弱的邊界等特點。

常見的LOG算子是5×5模板,如下所示:

由于LOG算子到中心的距離與位置加權系數的關系曲線像墨西哥草帽的剖面,所以LOG算子也叫墨西哥草帽濾波器,如圖5所示。

LOG算子的邊緣提取實現代碼如下所示:

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
 
#讀取圖像
img = cv2.imread('luo.png')
lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#灰度化處理圖像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#先通過高斯濾波降噪
gaussian = cv2.GaussianBlur(grayImage, (3,3), 0)
 
#再通過拉普拉斯算子做邊緣檢測
dst = cv2.Laplacian(gaussian, cv2.CV_16S, ksize = 3)
LOG = cv2.convertScaleAbs(dst)

#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']

#顯示圖形
titles = ['原始圖像', 'LOG算子']  
images = [lenna_img, LOG]  
for i in range(2):  
   plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

其運行結果如圖6所示:

四.總結

該系列文章主要通過Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr算子、Canny算子和LOG算子實現圖像銳化和邊緣檢測,有效地提取了圖像的輪廓,并進行了詳細地實驗處理。

到此這篇關于Python圖像銳化與邊緣檢測之Scharr,Canny,LOG算子詳解的文章就介紹到這了,更多相關Python Scharr Canny LOG內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 為Python的web框架編寫前端模版的教程

    為Python的web框架編寫前端模版的教程

    這篇文章主要介紹了為Python的web框架編寫前端模版的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python+Selenium實現網站滑塊拖動操作

    Python+Selenium實現網站滑塊拖動操作

    這篇文章主要為大家詳細介紹了如何利用Python+Selenium模擬實現登錄某網站的滑塊拖動操作,文中的示例代碼講解詳細,需要的可以參考一下
    2022-09-09
  • python進階_淺談面向對象進階

    python進階_淺談面向對象進階

    下面小編就為大家?guī)硪黄猵ython進階_淺談面向對象進階。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • python中Requests請求的安裝與常見用法

    python中Requests請求的安裝與常見用法

    Requests是一常用的http請求庫,它使用python語言編寫,可以方便地發(fā)送http請求,以及方便地處理響應結果,下面這篇文章主要給大家介紹了關于python中Requests請求的安裝與常見用法的相關資料,需要的朋友可以參考下
    2022-07-07
  • Python UI自動化測試Web frame及多窗口切換

    Python UI自動化測試Web frame及多窗口切換

    這篇文章主要為大家介紹了Python UI自動化測試Web frame及多窗口切換,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • python爬取各省降水量及可視化詳解

    python爬取各省降水量及可視化詳解

    本文是學習python,故選取了python最常用的爬蟲作為實操訓練同時,還添加了可視化和GUI入門的內容使爬取的內容應用更豐富,需要的朋友可以參考下
    2021-04-04
  • Python?OpenCV實現圖形檢測示例詳解

    Python?OpenCV實現圖形檢測示例詳解

    圖形檢測在計算機視覺開發(fā)中是一項非常重要的操作,算法通過對圖像的檢測,分析出圖像中可能存在哪些形狀。本文詳細介紹了Python+OpenCV如何實現圖形檢測,感興趣的可以了解一下
    2022-04-04
  • python中24小時制轉換為12小時制的方法

    python中24小時制轉換為12小時制的方法

    最近需要實現一個需求,求用戶輸入24小時制的時間,然后顯示12小時制的時間。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 實例講解Python中sys.argv[]的用法

    實例講解Python中sys.argv[]的用法

    在閱讀facenet網絡的代碼的時候,遇到了sys.argv[]這個函數,所以下面這篇文章主要給大家介紹了關于Python中sys.argv[]用法的相關資料,需要的朋友可以參考下
    2021-06-06
  • python對Excel按條件進行內容補充(推薦)

    python對Excel按條件進行內容補充(推薦)

    這篇文章主要介紹了python對Excel按條件進行內容補充的相關知識,非常不錯,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11

最新評論

湄潭县| 莱西市| 商城县| 延川县| 晴隆县| 茂名市| 辽中县| 油尖旺区| 五寨县| 澳门| 南开区| 南充市| 扎鲁特旗| 闻喜县| 星子县| 桃园县| 禹州市| 廉江市| 隆子县| 合阳县| 延长县| 万盛区| 武宣县| 巧家县| 玉门市| 富宁县| 利津县| 呼伦贝尔市| 海伦市| 惠安县| 五大连池市| 马公市| 乐业县| 靖江市| 尚志市| 葫芦岛市| 民和| 达日县| 云和县| 泾阳县| 盘山县|