sobel算子原理与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sobel算⼦原理与实现
简介
sobel算⼦是图像边缘检测的最重要的算⼦之⼀,在机器学习,数字媒体、计算机视觉等领域起着重要作⽤。
本⽂主要介绍sobel算⼦的计算过程。
python实现过程和python中相关函数的介绍。
⽅便读者实际中使⽤。
原理
边缘是指在图像上像素灰度变化最显著的地⽅,边缘检测算⼦则利⽤图像边缘灰度的突变来检测边缘。
Sobel算⼦包含两组3X3的滤波器,分别对⽔平和垂直⽅向上的边缘敏感。
让两个⽅向模板分别沿着X轴、Y轴与图像做卷积,⽅向是从上到下和从左到右。
将模板的中⼼和图像上的某个像素重合,并将该像素周围的点与模板上的系数相乘,如(3)和(4)所⽰,其中G(x)和G(y)分别表⽰横向及纵向边缘检测的图像梯度值。
G(X) = (X3 + 2X6 + X9)-(X1 + 2X4 + X7)
G(Y) = (X1 +2X2 +X3) - (X7 + 2X8 + X9)
图像上每个像素点的横向及纵向梯度值通过如下公式结合,来计算该点梯度值G的⼤⼩:
G = √G x2+G y2
为了减少运算时间,提⾼运算效率,可以使⽤绝对值求和近似的⽅法代替开平⽅:
G = ¦G x¦ + ¦G y ¦
最后选取合适的阈值,将像素点的灰度值与阈值进⾏⽐较,若⼤于阈值,则改点为图像的边缘点。
由于Sobel算⼦对于像素的位置影响做了加权,可以降低边缘模糊程度,与Prewitt算⼦,Roberts相⽐效果更好。
python实现
sobel算⼦在python中的实现有两种途径:opencv和skimage。
全部代码如下:
from skimage import data,filters,img_as_ubyte
import matplotlib.pyplot as plt
import cv2
# 图像读取
img = data.camera()
plt.imshow(img,plt.cm.gray)
'''**********skimage*************'''
# sobel边缘检测
edges = filters.sobel(img)
# 浮点型转成uint8型
edges = img_as_ubyte(edges)
# 显⽰图像
plt.figure()
plt.imshow(edges,plt.cm.gray)
# sobel ⽔平⽅向边缘检测
edgesh = filters.sobel_h(img)
edgesh = img_as_ubyte(edgesh)
plt.figure()
plt.imshow(edgesh,plt.cm.gray)
# sobel 竖直⽅向边缘检测
edgesv = filters.sobel_v(img)
edgesv = img_as_ubyte(edgesv)
plt.figure()
plt.imshow(edgesv,plt.cm.gray)
'''**********opencv*************'''
# sobel边缘检测
edges = cv2.Sobel(img,cv2.CV_16S,1,1)
# 浮点型转成uint8型
edges = cv2.convertScaleAbs(edges)
plt.figure()
plt.imshow(edges,plt.cm.gray)
# sobel ⽔平⽅向边缘检测
edges = cv2.Sobel(img,cv2.CV_16S,1,0)
edgesh = cv2.convertScaleAbs(edgesh)
plt.figure()
plt.imshow(edgesh,plt.cm.gray)
# sobel 竖直⽅向边缘检测
edges = cv2.Sobel(img,cv2.CV_16S,0,1) edgesv = cv2.convertScaleAbs(edgesv) plt.figure()
plt.imshow(edgesv,plt.cm.gray)。