小言_互联网的博客

在OpenCV里实现Sobel算子

596人阅读  评论(0)

前面学习过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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场