欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV-Python實(shí)現(xiàn)圖像梯度與Sobel濾波器

 更新時(shí)間:2021年06月11日 11:01:19   作者:一天一篇Python庫  
在實(shí)際應(yīng)用中我們只需要將圖像矩陣與Sobel濾波器卷積就可以得到圖像的梯度矩陣了。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

圖像梯度

圖像梯度計(jì)算的是圖像變化的速度。對(duì)于圖像的邊緣部分,其灰度值變化較大,梯度值也較大;相反,對(duì)于圖像中比較平滑的部分,其灰度值變化較小,相應(yīng)的梯度值也較小。一般情況下,圖像的梯度計(jì)算是圖像的邊緣信息。

其實(shí)梯度就是導(dǎo)數(shù),但是圖像梯度一般通過計(jì)算像素值的差來得到梯度的近似值,也可以說是近似導(dǎo)數(shù)。該導(dǎo)數(shù)可以用微積分來表示。

在微積分中,一維函數(shù)的一階微分的基本定義是這樣的:

一階微分

而圖像是一個(gè)二維函數(shù)f(x,y),其微分當(dāng)然就是偏微分。因此有:

偏微分

因?yàn)閳D像是一個(gè)離散的二維函數(shù),ϵ不能無限小,我們的圖像是按照像素來離散的,最小的ϵ就是1像素。因此,上面的圖像微分又變成了如下的形式(ϵ=1):

3

這分別是圖像在(x, y)點(diǎn)處x方向和y方向上的梯度,從上面的表達(dá)式可以看出來,圖像的梯度相當(dāng)于2個(gè)相鄰像素之間的差值。

那么,這個(gè)梯度(或者說灰度值的變化率)如何增強(qiáng)圖像的清晰度呢?

我們先考慮下x方向,選取某個(gè)像素,假設(shè)其像素值是100,沿x方向的相鄰像素分別是90,90,90,則根據(jù)上面的計(jì)算其x方向梯度分別是10,0,0。這里只取變化率的絕對(duì)值,表明變化的大小即可。

X

我們看到,100和90之間亮度相差10,并不是很明顯,與一大群90的連續(xù)灰度值在一起,輪廓必然是模糊的。我們注意到,如果相鄰像素灰度值有變化,那么梯度就有值,如果相鄰像素灰度值沒有變化,那么梯度就為0。如果我們把梯度值與對(duì)應(yīng)的像素相加,那么灰度值沒有變化的,像素值不變,而有梯度值的,灰度值變大了。

5

我們看到,相加后的新圖像,原圖像像素點(diǎn)100與90亮度只相差10,現(xiàn)在是110與90,亮度相差20了,對(duì)比度顯然增強(qiáng)了,尤其是圖像中物體的輪廓和邊緣,與背景大大加強(qiáng)了區(qū)別,這就是用梯度來增強(qiáng)圖像的原理。

上面只是說了x方向,y方向是一樣的。那么能否將x方向和y方向的梯度結(jié)合起來呢?當(dāng)然是可以的。x方向和y方向上的梯度可以用如下式子表示在一起:

6

這里又是平方,又是開方的,計(jì)算量比較大,于是一般用絕對(duì)值來近似平方和平方根的操作,來降低計(jì)算量:

7

原理了解后,我們來了解一些OpenCV提供了哪些梯度濾波器?

在OpenCV中,它給我們提供了三種不同的梯度濾波器,或者說高通濾波器:Sobel,Scharr 和Laplacian。什么叫高通呢?其實(shí)就是和圖像模糊相反。圖像模糊是讓低頻通過,阻擋高頻,這樣就可以去除噪點(diǎn),讓銳利的邊緣變平滑。高通濾波器就是讓高頻通過,阻擋低頻,可以讓邊緣更加明顯,增強(qiáng)圖像。

Sobel濾波器

Sobel濾波器是一種離散的微分算子,該算子結(jié)合了高斯平滑和微分求導(dǎo)運(yùn)算。該算子利用局部差分尋找邊緣,計(jì)算所得的是一個(gè)梯度的近似值。

具體的原理如下:

將Sobel濾波器與原始圖像進(jìn)行卷積計(jì)算,可以計(jì)算水平方向上的像素值變化情況。例如,當(dāng)Sobel濾波器的大小為3*3時(shí),水平方向偏導(dǎo)數(shù)的計(jì)算方式如下:

8

如果需要計(jì)算P5水平方向偏導(dǎo)數(shù)(梯度),則公式如下:

P5x=(P3-P1)+2*(P6-P4)+(P9-P7)

如果需要計(jì)算P5垂直方向偏導(dǎo)數(shù)(梯度),則公式如下:

P5y=(P7-P1)+2*(P8-P2)+(P9-P3)

在OpenCV中,它給我們提供cv2.Sobel()函數(shù)實(shí)現(xiàn)Sobel濾波器,其函數(shù)定義如下:

def Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None):

src:原始圖像

ddepth:輸出圖像的深度,詳細(xì)取值如下表:

輸入圖像深度 輸出圖像深度
cv2.CV_8U -1/cv2.CV_16S/cv2.CV_32F/cv2/CV_64F
cv2.CV_16U/cv2.CV_16S -1/cv2.CV_32F/cv2.CV_64F
cv2.CV_32F -1/cv2.CV_32F/cv2.CV_64F
cv2.CV_64F -1/cv2.CV_64F

dx:代表X方向的求導(dǎo)階數(shù)

dy:代表Y方向的求導(dǎo)階數(shù)

ksize:Sobel核的大小,該值為-1時(shí),則會(huì)使用Sobel濾波器進(jìn)行運(yùn)算

scale:計(jì)算導(dǎo)數(shù)值所采用的縮放因子,默認(rèn)值為1,時(shí)沒有縮放的

delta:加載目標(biāo)圖像上的值,該值可選,默認(rèn)為0

borderType:邊界樣式,前面博文有詳細(xì)介紹,這里不在贅述。

需要注意的是,如果將ddepth參數(shù)設(shè)置為-1,讓處理結(jié)果與原圖像保持一致,可以會(huì)得到錯(cuò)誤的結(jié)果。實(shí)際上,這么做會(huì)導(dǎo)致梯度值可能出現(xiàn)負(fù)數(shù)。如果處理的是8位圖像,意味著指定運(yùn)算的結(jié)果也是8位圖類型,那么所有的負(fù)數(shù)會(huì)自動(dòng)截?cái)酁?,發(fā)生信息丟失。為了避免信息丟失,在計(jì)算時(shí)先使用更高的數(shù)據(jù)類型cv2.CV_64F,再通過取絕對(duì)值將其映射為cv2.CV_8U類型。所以,我們使用Sobel濾波器常常會(huì)將ddepth設(shè)置為cv2.CV_64F。

計(jì)算X方向梯度語法格式為:

cv2.Sobel(src,ddepth,1,0)

計(jì)算Y方向梯度語法格式為:

cv2.Sobel(src,ddepth,0,1)

計(jì)算XY方向梯度語法格式為:

cv2.Sobel(src,ddepth,1,1)

計(jì)算XY疊加梯度語法格式為:

dx=cv2.Sobel(src,ddepth,1,0)
dy=cv2.Sobel(src,ddepth,0,1)
dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)

因?yàn)榭赡軙?huì)出現(xiàn)負(fù)數(shù),我們還需要使用另一個(gè)函數(shù)取絕對(duì)值,該函數(shù)為:cv2.convertScaleAbs(),其完整定義如下:

def convertScaleAbs(src, dst=None, alpha=None, beta=None):

alpha:調(diào)節(jié)系數(shù),可選值,默認(rèn)為1

beta:調(diào)節(jié)亮度值,默認(rèn)為0

下面,我們來使用Sobel濾波器,獲取圖像水平方向的邊緣信息,代碼如下:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0)
result=cv2.convertScaleAbs(sobel_x)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,效果如下所示:

9

接著,我們來使用Sobel濾波器,獲取圖像垂直方向的邊緣信息,代碼如下:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1)#更改這一行就行
result=cv2.convertScaleAbs(sobel_y)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,效果如下:

10

接著,我們來計(jì)算XY方向梯度,代碼如下:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_xy=cv2.Sobel(img,cv2.CV_64F,1,1)#都設(shè)置為1
result=cv2.convertScaleAbs(sobel_xy)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,效果如下:

11

最后,我們來計(jì)算其水平垂直兩個(gè)方向的疊加邊緣信息,代碼如下:

import cv2

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0)
sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1)
abx_x=cv2.convertScaleAbs(sobel_x)
abx_y=cv2.convertScaleAbs(sobel_y)
result=cv2.addWeighted(sobel_x,0.5,sobel_y,0.5,0)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,效果如下:

到此這篇關(guān)于OpenCV-Python實(shí)現(xiàn)圖像梯度與Sobel濾波器的文章就介紹到這了,更多相關(guān)OpenCV 圖像梯度與Sobel濾波器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • matplotlib繪制兩點(diǎn)間連線的幾種方法實(shí)現(xiàn)

    matplotlib繪制兩點(diǎn)間連線的幾種方法實(shí)現(xiàn)

    本文主要介紹了matplotlib繪制兩點(diǎn)間連線的幾種方法實(shí)現(xiàn),主要介紹了4種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Django rest framework分頁接口實(shí)現(xiàn)原理解析

    Django rest framework分頁接口實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Django rest framework分頁接口實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • django數(shù)據(jù)庫自動(dòng)重連的方法實(shí)例

    django數(shù)據(jù)庫自動(dòng)重連的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于django數(shù)據(jù)庫自動(dòng)重連的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解用Python練習(xí)畫個(gè)美隊(duì)盾牌

    詳解用Python練習(xí)畫個(gè)美隊(duì)盾牌

    這篇文章主要介紹了用Python練習(xí)畫個(gè)美隊(duì)盾牌,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 使用Python進(jìn)行有效的數(shù)據(jù)脫敏的常用方法

    使用Python進(jìn)行有效的數(shù)據(jù)脫敏的常用方法

    數(shù)據(jù)脫敏(Data Masking)是在數(shù)據(jù)處理和分析過程中,對(duì)敏感信息進(jìn)行處理,以保護(hù)個(gè)人隱私和企業(yè)機(jī)密的一種技術(shù)手段,數(shù)據(jù)脫敏的目的是不會(huì)泄露敏感信息,同時(shí)保持?jǐn)?shù)據(jù)的可用性和分析價(jià)值,本文給大家介紹了使用Python進(jìn)行有效的數(shù)據(jù)脫敏的常用方法,需要的朋友可以參考下
    2025-03-03
  • matlab繪制局部放大圖圖文教程

    matlab繪制局部放大圖圖文教程

    這篇文章主要給大家介紹了關(guān)于matlab繪制局部放大圖的相關(guān)資料,所謂局部放大即呈現(xiàn)子圖,以顯示局部細(xì)節(jié),需要的朋友可以參考下
    2023-07-07
  • Python中列表索引 A[ : 2 ]與A[ : , 2]的區(qū)別說明

    Python中列表索引 A[ : 2 ]與A[ : ,&nb

    這篇文章主要介紹了Python中列表索引 A[ : 2 ]與A[ : , 2]的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 詳解python中的異常捕獲

    詳解python中的異常捕獲

    這篇文章主要介紹了python中的異常捕獲的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • python數(shù)據(jù)抓取3種方法總結(jié)

    python數(shù)據(jù)抓取3種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)抓取的3種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 淺談numpy中函數(shù)resize與reshape,ravel與flatten的區(qū)別

    淺談numpy中函數(shù)resize與reshape,ravel與flatten的區(qū)別

    這篇文章主要介紹了淺談numpy中函數(shù)resize與reshape,ravel與flatten的區(qū)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評(píng)論