Python OpenCV Sobel 算子、Scharr 算子椰棘、laplacian 算子 復盤學習

Python OpenCV 365 天學習計劃纺棺,與橡皮擦一起進入圖像領域吧。本篇博客是這個系列的第 46 篇邪狞。
該系列文章導航參考:https://blog.csdn.net/hihell/category_10688961.html

基礎知識鋪墊

關于 Sobel 算子祷蝌、Scharr 算子、laplacian 算子在 這篇博客 中已經(jīng)學習過了帆卓,第二次學習巨朦,可以針對算子卷積核進行一下稍微深入一點的理解。

Sobel 算子

使用該函數(shù)時剑令,卷積核在 X 方向為: \begin{bmatrix} -1&0&+1\\ -2&0&+2\\-1&0&+1 \end{bmatrix}糊啡,在 Y 方向為\begin{bmatrix} -1&-2&-1\\ 0&0&0\\+1&+2&+1 \end{bmatrix}

上述卷積核時一個 3x3 的矩陣,當其與一個圖像進行卷積計算的時候吁津,如果覆蓋的矩陣是 \begin{bmatrix} p_1&p_2&p_3\\ p_4&p_5&p_6\\p_7&p_8&p_9 \end{bmatrix}

計算之后會得到如下結(jié)果 p_3-p_1+p_6-p_4+p_9-p_7 棚蓄,結(jié)果越大,差異越明顯碍脏,還有為什么在 p_4p_6 點梭依,卷積核的值大,簡單理解就是這個點距離中心點近典尾。

先寫一段測試代碼如下:

import cv2 as cv
import numpy as np


src = cv.imread('./star.png')

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)

# Sobel 算子計算邊緣
sobel_x = cv.Sobel(thresh, -1, 1, 0, ksize=3)

image = np.hstack((gray, thresh, sobel_x))
cv.imshow("image", image)
cv.waitKey()

運行結(jié)果如下:


2021022118251629[1].png

最后一幅圖片獲取到的是圖形的左側(cè)役拴,原因是這樣導致的。
Sobel 在計算的是時候是右側(cè)減左側(cè)钾埂、下面減上面河闰,查看二值化圖形會發(fā)現(xiàn),右側(cè)減左側(cè)會得到左側(cè)邊緣的原因是勃教,圖形左側(cè)的邊緣兩邊淤击,右側(cè)是白色 255,左側(cè)是黑色 0故源,所以可以得到邊緣,相同的方式汞贸,在圖形右側(cè)邊緣部分绳军,兩邊分別是右側(cè)黑色印机、左側(cè)白色,所以邊緣缺失门驾。

如果希望右側(cè)邊緣也同時出現(xiàn)射赛,需要用到下述函數(shù),將得到的負值獲取絕對值奶是。

另一處代碼修改的地方在代碼注釋部分:

# Sobel 算子計算邊緣
# 注意計算 sobel_x 的函數(shù)傳遞參數(shù)的時候楣责,第二個參數(shù)從 -1 修改為 cv.CV_64F,目的是為了獲取到負值聂沙,方便后面的獲取絕對值操作秆麸。
sobel_x = cv.Sobel(thresh, cv.CV_64F, 1, 0, ksize=3)
sobel_x = cv.convertScaleAbs(sobel_x)
image = np.hstack((gray, thresh, sobel_x))
Python OpenCV Sobel 算子、Scharr 算子及汉、laplacian 算子 復盤學習

上述代碼計算的是 X 方向的邊緣沮趣,同理計算一下 Y 方向的邊緣,在合并 X 與 Y 方向的邊緣坷随,即可得到最后的圖像邊緣房铭。

Python OpenCV Sobel 算子、Scharr 算子温眉、laplacian 算子 復盤學習
import cv2 as cv
import numpy as np


src = cv.imread('./star.png')

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)

# Sobel 算子計算邊緣
sobel_x = cv.Sobel(thresh, cv.CV_64F, 1, 0, ksize=3)
sobel_y = cv.Sobel(thresh, cv.CV_64F, 0, 1, ksize=3)
sobel_x = cv.convertScaleAbs(sobel_x)
sobel_y = cv.convertScaleAbs(sobel_y)
sobel_xy = cv.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)
image = np.hstack((gray, sobel_xy, sobel_x, sobel_y))
cv.imshow("image", image)
cv.waitKey()

合并之后運行結(jié)果如下缸匪,一般不建議直接計算 X 和 Y 方向的 Sobel,而應該分別計算之后再進行合并类溢。


20210221183355115[1].png

可以對比一下分開計算再合并與直接計算的效果差異凌蔬。

20210221183811420[1].png

上述圖片是由下面的代碼運行得到的結(jié)果

import cv2 as cv
import numpy as np


src = cv.imread('./t3.jpg')

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)

# Sobel 算子分開計算
sobel_x = cv.Sobel(thresh, cv.CV_64F, 1, 0, ksize=3)
sobel_y = cv.Sobel(thresh, cv.CV_64F, 0, 1, ksize=3)
sobel_x = cv.convertScaleAbs(sobel_x)
sobel_y = cv.convertScaleAbs(sobel_y)
sobel_xy = cv.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)

# 直接計算
sobel_xy1 = cv.Sobel(thresh, cv.CV_64F, 1, 1, ksize=3)
sobel_xy1 = cv.convertScaleAbs(sobel_xy1)
image = np.hstack((gray, sobel_xy, sobel_xy1))
cv.imshow("image", image)
cv.waitKey(0)

Scharr 算子

該算子有著比 Sobel 更好的精確度,主要因為它的卷積核是下面的數(shù)據(jù)
G_x =\begin{bmatrix}-3&0&+3\\ -10&0&+10\\-3&0&+3 \end{bmatrix}
G_y =\begin{bmatrix}-3&-10&-3\\ 0&0&0\\-3&-10&-3 \end{bmatrix}
使用的時候依舊是分開計算

import cv2 as cv
import numpy as np


src = cv.imread('./t3.jpg')

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)

# Scharr 算子分開計算
scharr_x = cv.Scharr(thresh, cv.CV_64F, 1, 0)
scharr_y = cv.Scharr(thresh, cv.CV_64F, 0, 1)
scharr_x = cv.convertScaleAbs(scharr_x)
scharr_y = cv.convertScaleAbs(scharr_y)
scharr_xy = cv.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)


image = np.hstack((gray, scharr_xy))
cv.imshow("image", image)
cv.waitKey(0)
20210221193236592[1].png

laplacian 算子

概算子的卷積核如下:
G =\begin{bmatrix}0&1&0\\ 1&-4&1\\0&1&0 \end{bmatrix}
laplacian 算子噪點敏感豌骏,在使用的時候需要提前去噪龟梦。

橡皮擦的小節(jié)

希望今天的 1 個小時你有所收獲,我們下篇博客見~

相關閱讀


技術專欄

  1. Python 爬蟲 100 例教程窃躲,超棒的爬蟲教程计贰,立即訂閱吧
  2. Python 爬蟲小課,精彩 9 講
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂窒,一起剝皮案震驚了整個濱河市躁倒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洒琢,老刑警劉巖秧秉,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衰抑,居然都是意外死亡象迎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砾淌,“玉大人啦撮,你說我怎么就攤上這事⊥舫” “怎么了赃春?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劫乱。 經(jīng)常有香客問我织中,道長,這世上最難降的妖魔是什么衷戈? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任狭吼,我火速辦了婚禮,結(jié)果婚禮上脱惰,老公的妹妹穿的比我還像新娘搏嗡。我一直安慰自己,他們只是感情好拉一,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布采盒。 她就那樣靜靜地躺著,像睡著了一般蔚润。 火紅的嫁衣襯著肌膚如雪磅氨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天嫡纠,我揣著相機與錄音烦租,去河邊找鬼。 笑死除盏,一個胖子當著我的面吹牛叉橱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播者蠕,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窃祝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了踱侣?” 一聲冷哼從身側(cè)響起粪小,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抡句,沒想到半個月后探膊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡待榔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年逞壁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡猾担,死狀恐怖袭灯,靈堂內(nèi)的尸體忽然破棺而出刺下,到底是詐尸還是另有隱情绑嘹,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布橘茉,位于F島的核電站工腋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畅卓。R本人自食惡果不足惜擅腰,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翁潘。 院中可真熱鬧趁冈,春花似錦、人聲如沸拜马。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俩莽。三九已至旺坠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扮超,已是汗流浹背取刃。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留出刷,地道東北人璧疗。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像馁龟,于是被迫代替她去往敵國和親崩侠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容