前面学习过Prewitt算子,它是采用平滑和差分来计算边缘,如果把平滑修改一下,改为高斯平滑,那么这个算子就叫做Sobel算子,这个算子的3阶表示如下:
x轴方向卷积核
y轴方向卷积核
Sobel算子是可分解的卷积核,比如x轴垂直方向可分解为:
[1,2,1]转置 * [-1,0,1]
这样很容易理解它是一维高斯平滑之后再做差分计算。当然,Sobel算子像高斯平滑一样,可以有3、5、7等阶的算子。
可以使用下面例子来演示:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
from scipy import signal
#图片的路径
imgname = "edge1.png"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)
#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))
#显示原图
cv2.imshow("Image",image)
#roberts算子
roberts_cross_h = np.array( [[ -1, -2, -1 ],
[ 0, 0, 0 ],
[ 1, 2, 1 ]] )
roberts_cross_v = np.array( [[ -1, 0, 1 ],
[ -2, 0, 2 ],
[ -1, 0, 1 ]] )
#
vertical = signal.convolve2d(image, roberts_cross_v,boundary='symm')
vertical1 = vertical.astype(np.uint8)
cv2.imshow("vertical",vertical1)
horizontal = signal.convolve2d(image, roberts_cross_h,boundary='symm')
horizontal1 = horizontal .astype(np.uint8)
cv2.imshow("horizontal",horizontal1)
#output_image = np.sqrt( np.square(horizontal) + np.square(vertical))
absX = cv2.convertScaleAbs(horizontal) # 转回uint8
absY = cv2.convertScaleAbs(vertical)
output_image = cv2.addWeighted(absX,0.5,absY,0.5,0)#线性插值
output_image = output_image.astype(np.uint8)
cv2.imshow("output_image",output_image)
#opencv Sobel()
x = cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3)
y = cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3)
absX = cv2.convertScaleAbs(x) # 转回uint8
absY = cv2.convertScaleAbs(y)
sobelXY = cv2.addWeighted(absX,0.5,absY,0.5,0)#线性插值
cv2.imshow("sobelXY",sobelXY)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
输入图片
水平计算
垂直计算
插值输出边缘
OpenCV里Sobel函数处理输出
在OpenCV里定义Sobel函数如下:
前四个是必须的参数:
第一个src参数是需要处理的图像;
第二个ddepth参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
其后是可选的参数:
dst是输出图像数组;
ksize是Sobel算子的大小,必须为1、3、5、7。
scale是缩放导数的比例常数,默认情况下没有伸缩系数;
delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。
https://blog.csdn.net/caimouse/article/details/51749579
转载:https://blog.csdn.net/caimouse/article/details/102130701
查看评论