网站开发 语言net,网络安全有名的培训学校,自己做网站难,安徽网站建设cnfgSobel算子是基于一阶导数的离散差分算子#xff0c;其中Sobel对于像素值的变化是十分敏感的#xff0c;在进行边缘检测的时候#xff0c;Sobel算子常用于对周围像素的重要性进行检测。
Sobel算子包括检验水平方向的算子和检测竖直方向的算子 计算机梯度值的操作如下#x…Sobel算子是基于一阶导数的离散差分算子其中Sobel对于像素值的变化是十分敏感的在进行边缘检测的时候Sobel算子常用于对周围像素的重要性进行检测。
Sobel算子包括检验水平方向的算子和检测竖直方向的算子 计算机梯度值的操作如下
用算子在图像上进行卷积操作检测水平边缘。公式为用算子在图像上进行卷积操作检测垂直边缘。 公式为结合水平方向和垂直方向计算每一个梯度点的数值公式为
在OpenCV中可以cv2.Sobel()来计算图像梯度值其中格式为cv2.Sobel(src,depth,dx,dy,size)其中第一个参数src表示的是需要处理的图像第二个参数depth表示的是图像的深度第三个参数dx和第四个参数dy分别选择水平和竖直方向size表示的是Sobel算子的大小。
下面有这么一张图像 1水平方向梯度计算
对上图计算进行卷积操作检测水平方向边缘
import cv2
import matplotlib.pyplot as plt
import numpy as npimagecv2.imread(rD:/Photo/3.png)
sobelx_imagecv2.Sobel(img,cv2.CV_64F,1,0,ksize3)
cv2.imshow(sobelx,sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下所示 在上图中会把负值截断为0因此我们需要添加一处操作
sobelx_imagecv2.convertScaleAbs(sobelx_image)
#取绝对值操作
完整代码为
import cv2
import matplotlib.pyplot as plt
import numpy as npimagecv2.imread(rD:/Photo/3.png)
sobelx_imagecv2.Sobel(img,cv2.CV_64F,0,1,ksize3)
sobelx_imagecv2.convertScaleAbs(sobelx_image)
cv2.imshow(sobelx,sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下所示 对于存在梯度的像素来说如果两个图像存在差异那么右边减去左边的不为0则有可能会正数或者有可能为负数因此需要取绝对值操作此时像素点为一个大于0的正数像素点部位不是纯黑色。
2竖直方向梯度计算 同理可以对竖直方向进行梯度计算代码为
import cv2
import matplotlib.pyplot as plt
import numpy as npimagecv2.imread(rD:/Photo/3.png)
sobelx_imagecv2.Sobel(img,cv2.CV_64F,0,1,ksize3)
cv2.imshow(sobelx,sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows() 运行结果如下所示 3完整的梯度计算
完整的梯度计算需要分别将水平方向和垂直方向分别乘上各自权值再求和例如将权值设置为0.5
sobelcv2.addWeighted(sobelx_image,0.5,sobely_image,0.5,0)
cv2.imshow(sobel,sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下所示 为什么不直接使用 sobel_imagecv2.Sobel(img,cv2.CV_64F,1,1,ksize3)呢因为在OpenCV中如果直接设置dx和dy的方向均为1的话那么可能会添加重影叠加效果不是很好因此不建议。