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

      網友投稿 1086 2025-03-31

      Python OpenCV 365 天學習計劃,與橡皮擦一起進入圖像領域吧。本篇博客是這個系列的第 46 篇。

      基礎知識鋪墊

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

      Sobel 算子

      使用該函數時,卷積核在 X 方向為:

      [

      ?

      1

      0

      +

      1

      ?

      2

      0

      +

      2

      ?

      1

      0

      +

      1

      ]

      \begin{bmatrix} -1&0&+1\ -2&0&+2\-1&0&+1 \end{bmatrix}

      ??? ?1?2?1 000 +1+2+1 ??? ,在 Y 方向為

      [

      ?

      1

      ?

      2

      ?

      1

      0

      0

      0

      +

      1

      +

      2

      +

      1

      ]

      \begin{bmatrix} -1&-2&-1\ 0&0&0\+1&+2&+1 \end{bmatrix}

      ??? ?10+1 ?20+2 ?10+1 ???

      上述卷積核時一個 3x3 的矩陣,當其與一個圖像進行卷積計算的時候,如果覆蓋的矩陣是

      [

      p

      1

      p

      2

      p

      3

      p

      4

      p

      5

      p

      6

      p

      7

      p

      8

      p

      9

      ]

      \begin{bmatrix} p_1&p_2&p_3\ p_4&p_5&p_6\p_7&p_8&p_9 \end{bmatrix}

      ??? p1 p4 p7 p2 p5 p8 p3 p6 p9 ???

      計算之后會得到如下結果

      p

      3

      ?

      p

      1

      +

      p

      6

      ?

      p

      4

      +

      p

      9

      ?

      p

      7

      p_3-p_1+p_6-p_4+p_9-p_7

      p3 ?p1 +p6 ?p4 +p9 ?p7 ,結果越大,差異越明顯,還有為什么在

      p

      4

      p_4

      p4 與

      p

      6

      p_6

      p6 點,卷積核的值大,簡單理解就是這個點距離中心點近。

      先寫一段測試代碼如下:

      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()

      運行結果如下:

      最后一幅圖片獲取到的是圖形的左側,原因是這樣導致的。

      Sobel 在計算的是時候是右側減左側、下面減上面,查看二值化圖形會發現,右側減左側會得到左側邊緣的原因是,圖形左側的邊緣兩邊,右側是白色 255,左側是黑色 0,所以可以得到邊緣,相同的方式,在圖形右側邊緣部分,兩邊分別是右側黑色、左側白色,所以邊緣缺失。

      如果希望右側邊緣也同時出現,需要用到下述函數,將得到的負值獲取絕對值。

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

      # Sobel 算子計算邊緣 # 注意計算 sobel_x 的函數傳遞參數的時候,第二個參數從 -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))

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

      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()

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

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

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

      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 更好的精確度,主要因為它的卷積核是下面的數據

      G

      x

      =

      [

      ?

      3

      0

      +

      3

      ?

      10

      0

      +

      10

      ?

      3

      0

      +

      3

      ]

      G_x =\begin{bmatrix}-3&0&+3\ -10&0&+10\-3&0&+3 \end{bmatrix}

      Gx =??? ?3?10?3 000 +3+10+3 ???

      G

      y

      =

      [

      ?

      3

      ?

      10

      ?

      3

      0

      0

      0

      ?

      3

      ?

      10

      ?

      3

      ]

      G_y =\begin{bmatrix}-3&-10&-3\ 0&0&0\-3&-10&-3 \end{bmatrix}

      Gy =??? ?30?3 ?100?10 ?30?3 ???

      使用的時候依舊是分開計算

      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)

      laplacian 算子

      概算子的卷積核如下:

      G

      =

      [

      0

      1

      0

      1

      ?

      4

      1

      0

      1

      0

      ]

      G =\begin{bmatrix}0&1&0\ 1&-4&1\0&1&0 \end{bmatrix}

      G=??? 010 1?41 010 ???

      laplacian 算子噪點敏感,在使用的時候需要提前去噪。

      橡皮擦的小節

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

      相關閱讀

      技術專欄

      Python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧

      Python 爬蟲小課,精彩 9 講

      今天是持續寫作的第

      88

      / 100 天。

      如果你想跟博主建立親密關系,可以關注同名公眾號

      夢想橡皮擦

      ,近距離接觸一個逗趣的互聯網高級網蟲。

      博主 ID:夢想橡皮擦,希望大家

      評論

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

      OpenCV Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel官網(Excel官網)
      下一篇:WPS文件打印的時候空格區域出現英文符號*****,預覽的時候也出現了,但是編輯的視乎就沒有出現,在
      相關文章
      亚洲精品天堂无码中文字幕| 亚洲最大中文字幕无码网站| 亚洲AV性色在线观看| 亚洲伊人久久大香线蕉结合| 亚洲成a人片毛片在线| 中文字幕亚洲免费无线观看日本| 亚洲永久永久永久永久永久精品| 亚洲不卡中文字幕无码| 亚洲一区爱区精品无码| 国产亚洲婷婷香蕉久久精品 | 亚洲中文字幕在线第六区| 国产亚洲成归v人片在线观看| 伊人亚洲综合青草青草久热| 亚洲中文字幕无码日韩| 亚洲一区二区女搞男| 亚洲国产成人精品无码区在线观看| 国产亚洲一区二区三区在线| 国产成人亚洲综合无码精品| 亚洲AV日韩AV永久无码免下载| 亚洲AV综合色区无码一区| 亚洲福利在线观看| 久久亚洲日韩看片无码| 亚洲国产韩国一区二区| 亚洲AV综合色区无码二区偷拍| 亚洲乱码在线卡一卡二卡新区 | 狠狠色婷婷狠狠狠亚洲综合| 久久精品国产亚洲一区二区三区| 伊人久久精品亚洲午夜| 亚洲av无码精品网站| 亚洲精品美女在线观看播放| 亚洲影视自拍揄拍愉拍| 国产精品久久久久久亚洲影视| 亚洲成a人一区二区三区| 亚洲一区视频在线播放| 亚洲AV永久纯肉无码精品动漫| 亚洲美女免费视频| 中国china体内裑精亚洲日本| 亚洲爆乳精品无码一区二区| 亚洲高清最新av网站| 亚洲精品无码久久久久去q| 91情国产l精品国产亚洲区|