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

python中的opencv?圖像梯度

 更新時(shí)間:2022年06月01日 16:22:42   作者:暴風(fēng)雨中的白楊  
這篇文章主要介紹了python中的opencv?圖像梯度,圖像梯度計(jì)算的是圖像變化的速度,圖像梯度計(jì)算需要求導(dǎo)數(shù),但是圖像梯度一般通過(guò)計(jì)算像素值的差來(lái)得到梯度的近似值,下文詳細(xì)介紹需要的小伙伴可以參考一下

圖像梯度

圖像梯度計(jì)算的是圖像變化的速度。對(duì)于圖像的邊緣部分,其灰度值變化較大,梯度值也較大;相反,對(duì)于圖像中比較平滑的部分,其灰度值變化較小,相應(yīng)的梯度值也較小。圖像梯度計(jì)算需要求導(dǎo)數(shù),但是圖像梯度一般通過(guò)計(jì)算像素值的差來(lái)得到梯度的近似值(近似導(dǎo)數(shù)值)。(差分,離散)

Sobel算子、Scharr算子和Laplacian算子的使用。

Sobel理論基礎(chǔ)

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

濾波器通常是指由一幅圖像根據(jù)像素點(diǎn)(x, y)臨近的區(qū)域計(jì)算得到另外一幅新圖像的算法。

濾波器是由鄰域及預(yù)定義的操作構(gòu)成的,濾波器規(guī)定了濾波時(shí)所采用的形狀以及該區(qū)域內(nèi)像素值的組成規(guī)律。濾波器也被稱為“掩模”、“核”、“模板”、“窗口”、“算子”等。一般信號(hào)領(lǐng)域?qū)⑵浞Q為“濾波器”,數(shù)學(xué)領(lǐng)域?qū)⑵浞Q為“核”。

線性濾波器: 濾波的目標(biāo)像素點(diǎn)的值等于原始像素值及其周圍像素值的加權(quán)和。這種基于線性核的濾波,就是所熟悉的卷積。

計(jì)算水平方向偏導(dǎo)數(shù)的近似值

將Sobel算子與原始圖像src進(jìn)行卷積計(jì)算,可以計(jì)算水平方向上的像素值變化情況。

例如,當(dāng)Sobel算子的大小為3×3時(shí),水平方向偏導(dǎo)數(shù)Gx的計(jì)算方式為:

計(jì)算垂直方向偏導(dǎo)數(shù)的近似值

當(dāng)Sobel算子的大小為3×3時(shí),垂直方向偏導(dǎo)數(shù)Gy的計(jì)算方式為:

Sobel算子及函數(shù)使用

使用函數(shù)cv2.Sobel()實(shí)現(xiàn)Sobel算子運(yùn)算,其語(yǔ)法形式為:

dst = cv2.Sobel( src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]] ) 
  • dst代表目標(biāo)圖像
  • src代表原始圖像
  • ddepth代表輸出圖像的深度

  • dx代表x方向上的求導(dǎo)階數(shù)。
  • dy代表y方向上的求導(dǎo)階數(shù)。
  • ksize代表Sobel核的大小。該值為-1時(shí),則會(huì)使用Scharr算子進(jìn)行運(yùn)算。
  • scale代表計(jì)算導(dǎo)數(shù)值時(shí)所采用的縮放因子,默認(rèn)情況下該值是1,是沒(méi)有縮放的。
  • delta代表加在目標(biāo)圖像dst上的值,該值是可選的,默認(rèn)為0。
  • borderType代表邊界樣式。

注意點(diǎn):參數(shù)ddepth

在函數(shù)cv2.Sobel()的語(yǔ)法中規(guī)定,可以將函數(shù)cv2.Sobel()內(nèi)ddepth參數(shù)的值設(shè)置為-1,讓處理結(jié)果與原始圖像保持一致。但是,如果直接將參數(shù)ddepth的值設(shè)置為-1,在計(jì)算時(shí)得到的結(jié)果可能是錯(cuò)誤的。

在實(shí)際操作中,計(jì)算梯度值可能會(huì)出現(xiàn)負(fù)數(shù)。如果處理的圖像是8位圖類型,則在ddepth的參數(shù)值為-1時(shí),意味著指定運(yùn)算結(jié)果也是8位圖類型,那么所有負(fù)數(shù)會(huì)自動(dòng)截?cái)酁?,發(fā)生信息丟失。為了避免信息丟失,在計(jì)算時(shí)要先使用更高的數(shù)據(jù)類型cv2.CV_64F,再通過(guò)取絕對(duì)值將其映射為cv2.CV_8U(8位圖)類型。

通常要將函數(shù)cv2.Sobel()內(nèi)參數(shù)ddepth的值設(shè)置為“cv2.CV_64F”。要將偏導(dǎo)數(shù)取絕對(duì)值,以保證偏導(dǎo)數(shù)總能正確地顯示出來(lái)。在OpenCV中,使用函數(shù)cv2.convertScaleAbs()對(duì)參數(shù)取絕對(duì)值,

該函數(shù)的語(yǔ)法格式為:

dst = cv2.convertScaleAbs( src [, alpha[, beta]] )
  • dst代表處理結(jié)果。
  • src代表原始圖像。
  • alpha代表調(diào)節(jié)系數(shù),該值是可選值,默認(rèn)為1。
  • beta代表調(diào)節(jié)亮度值,該值是默認(rèn)值,默認(rèn)為0。

該函數(shù)的作用是將原始圖像src轉(zhuǎn)換為256色位圖,其可以表示為:

dst=saturate(src*alpha+beta)

式中,saturate()表示計(jì)算結(jié)果的最大值是飽和值,例如: 當(dāng)“src*alpha+beta”的值超過(guò)255時(shí),其取值為255。

**例子:**使用函數(shù)cv2.convertScaleAbs()對(duì)一個(gè)隨機(jī)數(shù)組取絕對(duì)值。

import cv2
import numpy as np 
img=np.random.randint(-256,256, size=[4,5], dtype=np.int16)
rst=cv2.convertScaleAbs(img)
print("img=\n", img)
print("rst=\n", rst)

方向

在函數(shù)cv2.Sobel()中,參數(shù)dx表示x軸方向的求導(dǎo)階數(shù),參數(shù)dy表示y軸方向的求導(dǎo)階數(shù)。參數(shù)dx和dy通常的值為0或者1,最大值為2。如果是0,表示在該方向上沒(méi)有求導(dǎo)。當(dāng)然,參數(shù)dx和參數(shù)dy的值不能同時(shí)為0。

參數(shù)dx和參數(shù)dy可以有多種形式的組合,主要包含:

  • 計(jì)算x方向邊緣(梯度):dx=0, dy=1。
  • 計(jì)算y方向邊緣(梯度):dx=1, dy=0。
  • 參數(shù)dx與參數(shù)dy的值均為1:dx=1, dy=1。
  • 計(jì)算x方向和y方向的邊緣疊加:通過(guò)組合方式實(shí)現(xiàn)。

例子

“dx=1, dy=0”。當(dāng)然,也可以設(shè)置為“dx=2, dy=0”。此時(shí),會(huì)僅僅獲取垂直方向的邊緣信息,

此時(shí)的語(yǔ)法格式為:

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

“dx=0, dy=1”。當(dāng)然,也可以設(shè)置為“dx=0, dy=2”。此時(shí),會(huì)僅僅獲取水平方向的邊緣信息,

此時(shí)的語(yǔ)法格式為:

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

“dx=1, dy=1”,也可以設(shè)置為“dx=2, dy=2”,或者兩個(gè)參數(shù)都不為零的其他情況。此時(shí),會(huì)獲取兩個(gè)方向的邊緣信息,

此時(shí)的語(yǔ)法格式為:

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

計(jì)算x方向和y方向的邊緣疊加

如果想獲取x方向和y方向的邊緣疊加,需要分別獲取水平方向、垂直方向兩個(gè)方向的邊緣圖,然后將二者相加。

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

例子:

使用函數(shù)cv2.Sobel()獲取圖像水平方向的完整邊緣信息

將參數(shù)ddepth的值設(shè)置為cv2.CV_64F,并使用函數(shù)cv2.convertScaleAbs()對(duì)cv2.Sobel()的計(jì)算結(jié)果取絕對(duì)值。

import cv2
o = cv2.imread('Sobel4.bmp', cv2.IMREAD_GRAYSCALE)
Sobelx = cv2.Sobel(o, cv2.CV_64F,0,1)
Sobelx = cv2.convertScaleAbs(Sobelx)
cv2.imshow("original", o)
cv2.imshow("x", Sobelx)
cv2.waitKey()
cv2.destroyAllWindows()

計(jì)算函數(shù)cv2.Sobel()在水平、垂直兩個(gè)方向疊加的邊緣信息。

import cv2
o = cv2.imread('Sobel4.bmp', cv2.IMREAD_GRAYSCALE)
Sobelx = cv2.Sobel(o, cv2.CV_64F,1,0)
Sobely = cv2.Sobel(o, cv2.CV_64F,0,1)
Sobelx = cv2.convertScaleAbs(Sobelx)
Sobely = cv2.convertScaleAbs(Sobely)
Sobelxy =  cv2.addWeighted(Sobelx,0.5, Sobely,0.5,0)
cv2.imshow("original", o)
cv2.imshow("xy", Sobelxy)
cv2.waitKey()
cv2.destroyAllWindows()

Scharr算子及函數(shù)使用

在離散的空間上,有很多方法可以用來(lái)計(jì)算近似導(dǎo)數(shù),在使用3×3的Sobel算子時(shí),可能計(jì)算結(jié)果并不太精準(zhǔn)。

OpenCV提供了Scharr算子,該算子具有和Sobel算子同樣的速度,且精度更高。

可以將Scharr算子看作對(duì)Sobel算子的改進(jìn),其核通常為:

OpenCV提供了函數(shù)cv2.Scharr()來(lái)計(jì)算Scharr算子,其語(yǔ)法格式如下:

dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] ) 
  • dst代表輸出圖像。
  • src代表原始圖像。
  • ddepth代表輸出圖像深度。該值與函數(shù)cv2.Sobel()中的參數(shù)ddepth的含義相同
  • dx代表x方向上的導(dǎo)數(shù)階數(shù)。
  • dy代表y方向上的導(dǎo)數(shù)階數(shù)。
  • scale代表計(jì)算導(dǎo)數(shù)值時(shí)的縮放因子,該項(xiàng)是可選項(xiàng),默認(rèn)值是1,表示沒(méi)有縮放。
  • delta代表加到目標(biāo)圖像上的亮度值,該項(xiàng)是可選項(xiàng),默認(rèn)值為0。
  • borderType代表邊界樣式。

在函數(shù)cv2.Sobel()中,如果ksize=-1,則會(huì)使用Scharr濾波器。

如下語(yǔ)句:

dst=cv2.Scharr(src, ddepth, dx, dy)

dst=cv2.Sobel(src, ddepth, dx, dy, -1)

是等價(jià)的。函數(shù)cv2.Scharr()和函數(shù)cv2.Sobel()的使用方式基本一致。參數(shù)ddepth的值應(yīng)該設(shè)置為“cv2.CV_64F”,并對(duì)函數(shù)cv2.Scharr()的計(jì)算結(jié)果取絕對(duì)值,才能保證得到正確的處理結(jié)果。

具體語(yǔ)句為:

dst=Scharr(src, cv2.CV_64F, dx, dy)
dst= cv2.convertScaleAbs(dst)

在函數(shù)cv2.Scharr()中,要求參數(shù)dx和dy滿足條件:

  • dx >= 0 && dy >= 0 && dx+dy == 1
  • 和Sobel 不同, Scharr 的dx+dy 必須為1

參數(shù)dx和參數(shù)dy的組合形式有:

  • 計(jì)算x方向邊緣(梯度):dx=0, dy=1。
  • 計(jì)算y方向邊緣(梯度): dx=1, dy=0。
  • 計(jì)算x方向與y方向的邊緣疊加:通過(guò)組合方式實(shí)現(xiàn)。

例子

計(jì)算x方向邊緣(梯度):dx=1, dy=0

dst=Scharr(src, ddpeth, dx=1, dy=0) 

計(jì)算y方向邊緣(梯度):dx=0, dy=1

dst=Scharr(src, ddpeth, dx=0, dy=1)

計(jì)算x方向與y方向的邊緣疊加

將兩個(gè)方向的邊緣相加

dx=Scharr(src, ddpeth, dx=1, dy=0) 
dy=Scharr(src, ddpeth, dx=0, dy=1)
Scharrxy=cv2.addWeighted(dx,0.5, dy,0.5,0)

參數(shù)dx和dy的值不能都為1

Sobel算子和Scharr算子的比較

Sobel算子的缺點(diǎn)是,當(dāng)其核結(jié)構(gòu)較小時(shí),精確度不高,而Scharr算子具有更高的精度。

Sobel算子和Scharr算子的核結(jié)構(gòu):

Laplacian算子及函數(shù)使用

Laplacian(拉普拉斯)算子是一種二階導(dǎo)數(shù)算子,其具有旋轉(zhuǎn)不變性,可以滿足不同方向的圖像邊緣銳化(邊緣檢測(cè))的要求。

通常情況下,其算子的系數(shù)之和需要為零。

一個(gè)3×3大小的Laplacian算子

Laplacian算子類似二階Sobel導(dǎo)數(shù),需要計(jì)算兩個(gè)方向的梯度值。

計(jì)算結(jié)果的值可能為正數(shù),也可能為負(fù)數(shù)。所以,需要對(duì)計(jì)算結(jié)果取絕對(duì)值,以保證后續(xù)運(yùn)算和顯示都是正確的。

在OpenCV內(nèi)使用函數(shù)cv2.Laplacian()實(shí)現(xiàn)Laplacian算子的計(jì)算,該函數(shù)的語(yǔ)法格式為:

dst = cv2.Laplacian( src, ddepth[, ksize[, scale[, delta[, borderType]]]] ) 
  • dst代表目標(biāo)圖像。
  • src代表原始圖像。
  • ddepth代表目標(biāo)圖像的深度。
  • ksize代表用于計(jì)算二階導(dǎo)數(shù)的核尺寸大小。該值必須是正的奇數(shù)。
  • scale代表計(jì)算Laplacian值的縮放比例因子,該參數(shù)是可選的。默認(rèn)情況下,該值為1,表示不進(jìn)行縮放。
  • delta代表加到目標(biāo)圖像上的可選值,默認(rèn)為0。
  • borderType代表邊界樣式。

該函數(shù)分別對(duì)x、y方向進(jìn)行二次求導(dǎo),具體為:

上式是當(dāng)ksize的值大于1時(shí)的情況。當(dāng)ksize的值為1時(shí),Laplacian算子計(jì)算時(shí)采用的3×3的核如下:

通過(guò)從圖像內(nèi)減去它的Laplacian圖像,可以增強(qiáng)圖像的對(duì)比度,此時(shí)其算子為:

例子: 使用函數(shù)cv2.Laplacian()計(jì)算圖像的邊緣信息。

import cv2
o = cv2.imread('Laplacian.bmp', cv2.IMREAD_GRAYSCALE)
Laplacian = cv2.Laplacian(o, cv2.CV_64F)
Laplacian = cv2.convertScaleAbs(Laplacian)
cv2.imshow("original", o)
cv2.imshow("Laplacian", Laplacian)
cv2.waitKey()
cv2.destroyAllWindows()

算子總結(jié)

Sobel算子、Scharr算子、Laplacian算子都可以用作邊緣檢測(cè)

Sobel算子和Scharr算子計(jì)算的都是一階近似導(dǎo)數(shù)的值。通常情況下,可以將它們表示為:

  • Sobel算子= |左-右| 或 |下-上|
  • Scharr算子=|左-右| 或 |下-上|

Laplacian算子計(jì)算的是二階近似導(dǎo)數(shù)值,可以將它表示為:

  • Laplacian算子=|中-左| + |中-右| + |中-下| + |中-上|

到此這篇關(guān)于python中的opencv 圖像梯度的文章就介紹到這了,更多相關(guān)python opencv 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 畫(huà)出使用分類器得到的決策邊界

    python 畫(huà)出使用分類器得到的決策邊界

    這篇文章主要介紹了python 畫(huà)出使用分類器得到的決策邊界,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Pygame中Sprite的使用方法示例詳解

    Pygame中Sprite的使用方法示例詳解

    這篇文章主要介紹了Pygame中Sprite的使用方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 詳解OpenCV實(shí)現(xiàn)特征提取的方法

    詳解OpenCV實(shí)現(xiàn)特征提取的方法

    在本文中,我們將一起探索幾種從圖像中提取顏色、形狀和紋理特征的方法,這些方法基于處理圖像的經(jīng)驗(yàn),感興趣的小伙伴可以了解一下
    2022-05-05
  • Python類和方法注釋規(guī)范說(shuō)明

    Python類和方法注釋規(guī)范說(shuō)明

    這篇文章主要介紹了Python類和方法注釋規(guī)范說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例

    Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例

    opencv是一個(gè)很強(qiáng)大的庫(kù),支持多個(gè)編程語(yǔ)言,下面這篇文章主要給大家介紹了關(guān)于Python?OpenCV實(shí)現(xiàn)3種濾鏡效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • python2與python3中關(guān)于對(duì)NaN類型數(shù)據(jù)的判斷和轉(zhuǎn)換方法

    python2與python3中關(guān)于對(duì)NaN類型數(shù)據(jù)的判斷和轉(zhuǎn)換方法

    今天小編就為大家分享一篇python2與python3中關(guān)于對(duì)NaN類型數(shù)據(jù)的判斷和轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • PyCharm配置與更換鏡像源及安裝第三方庫(kù)的過(guò)程

    PyCharm配置與更換鏡像源及安裝第三方庫(kù)的過(guò)程

    這篇文章主要介紹了PyCharm配置與更換鏡像源及安裝第三方庫(kù)的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • python隨機(jī)生成指定長(zhǎng)度密碼的方法

    python隨機(jī)生成指定長(zhǎng)度密碼的方法

    這篇文章主要介紹了python隨機(jī)生成指定長(zhǎng)度密碼的方法,涉及Python操作字符串的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • python性能檢測(cè)工具函數(shù)運(yùn)行內(nèi)存及運(yùn)行時(shí)間

    python性能檢測(cè)工具函數(shù)運(yùn)行內(nèi)存及運(yùn)行時(shí)間

    這篇文章主要介紹了python性能檢測(cè)工具函數(shù)運(yùn)行內(nèi)存及運(yùn)行時(shí)間,python雖然是一門(mén)慢語(yǔ)言,但是也有著比較多的性能檢測(cè)工具來(lái)幫助我們優(yōu)化程序的運(yùn)行效率,下文小編給大家分享五個(gè)性能檢測(cè)工具,需要的朋友可以參考一下
    2022-05-05
  • 小議Python中自定義函數(shù)的可變參數(shù)的使用及注意點(diǎn)

    小議Python中自定義函數(shù)的可變參數(shù)的使用及注意點(diǎn)

    Python函數(shù)的默認(rèn)值參數(shù)只會(huì)在函數(shù)定義處被解析一次,以后再使用時(shí)這個(gè)默認(rèn)值還是一樣,這在與可變參數(shù)共同使用時(shí)便會(huì)產(chǎn)生困惑,下面就來(lái)小議Python中自定義函數(shù)的可變參數(shù)的使用及注意點(diǎn)
    2016-06-06

最新評(píng)論