機器學習進階-圖像梯度運算-Sobel算子 1. cv2.Sobel(使用Sobel算子進行計算) 2. cv2.convertScalerAbs(將像素點進行絕對值的計算)

1.cv2.Sobel(src, ddepth, dx, dy, ksize)  進行sobel算子計算spa

參數說明:src表示當前圖片,ddepth表示圖片深度,這裏使用cv2.CV_64F使得結果能夠是負值, dx表示x軸方向,dy表示y軸方向, ksize表示移動方框的大小3d

2.cv2.convertScalerAbs(src)  將像素點進行絕對值計算code

參數說明: src表示當前圖片blog

sobel算子:分爲x軸方向和y軸方向上的,x軸方向上的算子如圖中的Gx,將sober算子在圖中進行平移,當前位置的像素值等於sobel算子與(當前位置與周邊位置8個點)進行對應位置相乘並相加操做,做爲當前位置的像素點,y軸方向的算子如Gy, 對於x軸方向上,即左右兩邊的比較,圖片

計算方程爲:x軸: p3 - p1 + 2 * p6 - 2 * p4 + p9 - p7, 右邊的像素值減去左邊的像素值it

 

代碼:class

第一步:載入原始圖片import

第二步:使用cv2.Sobel(src, cv2.CV_64F, 1, 0, ksize=3)  對x軸方向進行sobel算子相乘操做numpy

第三步:因爲會出現負值的狀況,所以使用cv2.convertScalerAbs() 轉換爲絕對值的形式im

第四步:計算y軸方向上的sobel算子

第五步:使用cv2.addWeighted 將x軸方向的sobel算子的結果和y軸方向上的sobel算子的結果結合

第六步:使用cv2.Sobel(src, cv2.CV_64F, 1, 1, ksize=3) 直接得到x軸和y軸方向上的sobel算子結合

第七步:對這兩個步驟得到的sobel算子做圖

import cv2 import numpy as np # 第一步:加載圖片
img = cv2.imread('pie.png') cv2.imshow('original', img) cv2.waitKey(0) cv2.destroyAllWindows()

# 第二步:對x軸方向上進行sobel算子相乘操做
x_sobel = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) cv2.imshow('x_sobel', x_sobel) cv2.waitKey(0) cv2.destroyAllWindows()

畫圖時的負值,使用0來進行表示,所以右側是黑色的

# 第三步:由於右側像素減去左邊像素,存在負值的狀況,所以使用cv2.convertScaleAbs取絕對值操做
x_sobel = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) x_sobel = cv2.convertScaleAbs(x_sobel) cv2.imshow('x_sobel', x_sobel) cv2.waitKey(0) cv2.destroyAllWindows()

# 第四步:計算y軸的sobel算子
y_sobel = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) y_sobel = cv2.convertScaleAbs(y_sobel) cv2.imshow('y_sobel', y_sobel) cv2.waitKey(0) cv2.destroyAllWindows()

# 第五步:並使用cv2.addweighted進行合併
xy_sobel = cv2.addWeighted(x_sobel, 0.5, y_sobel, 0.5, 0) # 第六步: 直接使用cv2.sobel 進行計算
xy_sobel_direct = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3) # 第七步:畫圖比較分步合併和一步到位的結果差別
cv2.imshow('imgs', np.hstack((xy_sobel, xy_sobel_direct))) cv2.waitKey(0) cv2.destroyAllWindows()

從圖中咱們能夠看出x和y軸各自求,再作合併比直接求得的結果,輪廓更加的明顯

相關文章
相關標籤/搜索