sobel算子
Sobel算子算法的优点是计算简单,速度快。但是由于只采用了2个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。该算法认为:凡灰度新值大于或等于阈值的像素点时都是边缘点。这种判断欠合理,会造成边缘点的误判,因为许多噪声点的灰度值也很大。
右边-左边,差异值作为水平方向
下面-上面,差异值作为垂直方向
dst= cv2.Sobel(src,ddepth,dx,dy,ksize)
- ddepth:图像深度,都是默认-1,表示输入输出深度一样
- dx,dy:分别表示水平和竖直方向
- ksize:是Sobel算子的大小 ,表示核的大小
import cv2
import numpy as np
img = cv2.imread('F:/picture/desk/1.jpg')
def cv_imshow(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
# cv2.CV_64F能表示负数的形式,白-黑是正数,黑-白就是负数了,
# 所有的负数会被截断0,所以要取绝对值
# dx=1,dy=0 表示计算水平方向的,不计算竖直方向,谁为1,计算谁
cv_imshow(sobelx,'sobelx')
在滤波函数第二个参数,当我们使用-1表示输出图像与输入图像的数据类型一致时,如果原始图像是uint8型的,那么在经过算子计算以后,得到的图像可能会有负值,如果与原图像数据类型一致,那么负值就会被截断变成0或者255,使得结果错误,那么针对这种问题有两种方式改变(上述程序中都有):一种就是改变输出图像的数据类型(第二个参数cv2.CV_64F),另一种就是改变原始图像的数据类型(此时第二个参数可以为-1,与原始图像一致)。
img = cv2.imread('F:/pictu