圖像有像素組成,像素都是一個一個的數值,我們所能看到的圖像的邊界都是色彩變化很大的區域。所以當檢測某個像素周圍的值,值的差異很大,也就是梯度很大時,則可以判定該位置為邊界。
1,sobel算子理論基礎:
x方向的梯度:右邊-左邊
(水平方向找的豎向的邊界):(系數取決於卷積核)如果左右兩列差別不大,則P5計算出來的值不會很大;如果左右兩列的值差別很大,則P5計算出來的值會很大,則可以判定P5處在邊界位置
dx=1,dy=0:
y方向的梯度:下邊-上邊
(豎直方向梯度找到的水平的邊界):(系數取決於卷積核)如果上下兩行差別不大,則P5計算出來的值不會很大;如果上下兩行的值差別很大,則P5計算出來的值會很大,則可以判定P5處在邊界位置
dx=0,dy=1:
整體梯度:
#圖像梯度——sobel算子
#dst=cv2.Sobel(src,ddepth,dx,dy,[ksize])
#ddepth——處理結果圖像的深度;通常將參數設置為-1,表示處理結果與原圖像保持一致;深度就是數據類型是幾位的。8位的里面沒有負值
#ddepth處理圖像深度,實際操作過程中,計算梯度值可能會出現負值。通常處理的圖像都是np.uint8類型,
# 如果結果也是該類型,所有的負數都會截斷為0,發生信息缺失。所以通常計算時,使用更高的數據類型cv2.CV_64F(里面既有正數又有負數),
# 取絕對值后,在轉換為np.uint8類型。
#dst=cv2.convertScaleAbs(src,alpha,beta):將原始圖像轉換為256色位圖
#dx——x方向;dy——y方向
#計算x方向的梯度:[dx=1,dy=0]; 計算y方向的梯度:[dx=0;dy=1]
#dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)——計算兩幅圖像的權重值;、
import cv2
import numpy as np
img=cv2.imread("image\\lena.bmp",cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx) # 轉回uint8
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
sobelxy11=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
cv2.namedWindow("waterbox",cv2.WINDOW_NORMAL)
cv2.imshow('waterbox',img)
2,scharr算子
使用3*3sobel算子。可能不太精准;scharr算子更加精准,但兩者的計算量差不多
#圖像梯度——scharr算子
#dst=Scharr(src,ddpeth,dx,dy)
#滿足條件:dx>=0&&dy>=0&&dx+dy==1
import cv2
import numpy as np
o = cv2.imread('image\\lena.bmp',cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
scharrx = cv2.convertScaleAbs(scharrx) # 轉回uint8
scharry = cv2.convertScaleAbs(scharry)
cv2.imshow("original",o)
cv2.imshow("y",scharry)
cv2.imshow("x",scharrx)
cv2.imshow("xy",scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()
sobel算子識別比較突出的邊界
scharr算子可以將比較細微的邊界識別出來
3.拉普拉斯算子——二階算子
import cv2
import numpy as np
o = cv2.imread('image\\lena.bmp',cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(o,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian) # 轉回uint8
cv2.imshow("original",o)
cv2.imshow("laplacian",laplacian)
cv2.waitKey()
cv2.destroyAllWindows()