Python OpenCV 365 天學習計劃,與橡皮擦一起進入影像領域吧,本篇博客是這個系列的第 46 篇,
該系列文章導航參考:https://blog.csdn.net/hihell/category_10688961.html
Python OpenCV
- 基礎知識鋪墊
- Sobel 算子
- Scharr 算子
- laplacian 算子
- 橡皮擦的小節
基礎知識鋪墊
關于 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:夢想橡皮擦,希望大家點贊、評論、收藏,
CSDN認證博客專家
高級產品經理
互聯網從業者
業余編程愛好者
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262039.html
標籤:python
