图像有像素组成,像素都是一个一个的数值,我们所能看到的图像的边界都是色彩变化很大的区域。所以当检测某个像素周围的值,值的差异很大,也就是梯度很大时,则可以判定该位置为边界。
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()