文章结构

  • 1. 简述Sobel算子
  • 2. ndimage.Sobel
  • 3. Sobel 算子自实现
  • 4. Sobel算子的一些缺陷和替代方案

1. 简述Sobel算子

索伯算子主要用于边界检测,该算法相对其他的边界检测算法而言是比较的容易。但是对于噪声的鲁棒性要低于其他的边界检测技术。比如canny。
索伯算子是一种多用于边缘检测的离散性差分算子。索伯算子有两组不同的卷积因子,可以为一张图片做横向以及纵向的平面卷积。详细的讲就是,假设要对一张图中的(x,y)这个像素使用索伯算子。首先用两个卷积因子分别对该点做卷积,从而可得出该点在这两个方向上的亮度差分近似值。将xy两个方向的亮度近似值进行结合之后,即可得到该点亮度。 得到的是一个数,如果这个值大于了阈值,那么这个点就可以被考虑成边缘点。

2. ndimage.Sobel

首先看看ndimage提供的索伯算子是什么样的效果。要注意的是 python中提供的sobel API,有的只能支出2维的输入,如果不降图片变成灰度图片,直接使用API会出现报错。

ValueError: The parameter `image` must be a 2-dimensional array

sobel算子的实现主要分以下几步来完成。

  • 首先需要将需要边缘检测的图像进行黑白处理。因为色彩对于边缘检测的影响很小。

  • 分别计算灰度图片横向和纵向的梯度。

  • 计算两个方向梯度的幅值。

  • 规范化梯度

下面以一张彩色的加菲猫照片,来展示简单边缘检测的基本流程个效果。
代码分成两个板块:边缘检测和图像展示
边缘检测的代码展示如下:

def edges_detection(img):#img must be grayscaledimg_gray = sc.rgb2gray(img) #partial derivative of x_axisdx = ndimage.sobel(img_gray,1)dy = ndimage.sobel(img_gray,0)#magnitudemag = np.hypot(dx,dy)#shown as image. must be 8 bit integer# mag = 255.0/ np.amax(mag)# mag = mag.astype(np.int8)return mag

原图以及图像结果的展示的代码如下所示:

def plot_res(img,mag):figure = plt.figure()figure.add_subplot(121)plt.imshow(img)# plt.show()figure.add_subplot(122)plt.imshow(mag)plt.show()

结果展示如图所示:

3. Sobel 算子自实现

以下内容为sobel算子python自实现的一些细节。下图是sobel算子实现需要的一些函数

convolution函数的是用于对某一个像素点(x,y)进行横向或者纵向的平面卷积。他需要3个参数,x,y,以及x_convolution。x和y顾名思义就是,当前像素的坐标,x_convolution是一个布尔值,如果为正将使用水平方向的卷积因子,反之,则使用纵向的卷积因子。
convolution 完整代码如下:

  def convoltiion(self,x,y,x_convolution = True): #calculate single pixel.'''note that all operations must be done within the range.Therefore, pay attention on those pixels on the margin.operation does not start at(0,0) but (1,1), ends at(x-1,y-1).:param x::param y::return:'''y_coordinate = [y-1,y,y+1]x_coordinate = [x-1,x,x+1]res = 0if x_convolution:kernel = self.x_kernelconv_res = self.x_conv_reselse:kernel = self.y_kernelconv_res = self.y_conv_resfor x_k_cor_ ,x_y in zip(range(kernel.shape[1]),y_coordinate): # y = 0 ,1 2for x_k_cor, x_x in zip(range(kernel.shape[0]),x_coordinate): # x = 0,1,2res = res + self.gray_img[x_x,x_y] * kernel[x_k_cor,x_k_cor_]conv_res[x,y]  = resreturn   conv_res

上述代码的为题在于,循环图中的每一个像素,势必不能保证算法的时间复杂度。因为图片越大,复杂度越大。

接下来需要将图片中所有的点都用上述的方法,从水平和纵向进分别进行平面卷积,
两个方向的卷积,原理上没有很大的变化,只是卷积因子发生了改变。

 def conv(self,Y_):for y_coordinate in range(1,img_gray.shape[1]-1):for x_coordinate in range(1,img_gray.shape[0]-1):res_ =  self.convoltiion(x_coordinate,y_coordinate,x_convolution=Y_)return res_

当求得了水平方向和纵向的卷积结果之后,将两个方向的结果结合起来便可以得到赋值。

    def magnitude(self,x_conv,y_conv):return np.sqrt(np.square(x_conv)+np.square(y_conv))

之后显示一下效果:

 def my_plot(self,x_conv_res,y_conv_res,mag):figure_ = plt.figure()ax1 = figure_.add_subplot(141)ax1.set_title('original img')plt.imshow(img_array)ax2= figure_.add_subplot(142)ax2.set_title('x_convolution')plt.imshow(x_conv_res,cmap='gray')ax3 = figure_.add_subplot(143)ax3.set_title('y_convolution')plt.imshow(y_conv_res,cmap='gray')ax4 = figure_.add_subplot(144)ax4.set_title('magnitude')plt.imshow(mag,cmap='gray')plt.show()


实现的效果与ndimage的效果类似。颜色的不同是因为在画图的时候,更改了cmap。

4. Sobel算子的一些缺陷和替代方案

从图中可以看到的是用sobel的边缘检测,检测出来的边界是比较粗的,意味着这样的检测方式在一些情况下是不够精确的,因为我们最理想的状态是边缘的宽度是一很窄的线(单像素),而不是一个区域。在实际的生产中,我们通常会使用canny的边缘检测算法。它的效果相符于前者的效果更好。简单而言,canny对噪音的鲁棒性要比sobel要好。 canny的API在skimage.feature中提供。代码与三者比较如下所示:

    canny_ = canny(img_gray, sigma=5)

索伯(Sobel)算子原理讲解和实现相关推荐

  1. Python实现索伯尔算子

    Python实现索伯尔算子 最近在学习Python,正好用sobel算子练练手,将就看看吧 先放原图 用Opencv中sobel算子做一下对比: # OpenCVori_img = cv.imread ...

  2. 【Pytorch神经网络理论篇】 11 卷积网络模型+Sobel算子原理

    1 视觉角度理解卷积神经网络 1.1 卷积神经网络与生物视觉系统的关系 卷积神经网络的工作流程与生物大脑的处理视觉信号的流程相似,即:将图像从基础像素到局部信息再到整体信息的转化.大脑在对图像进行分级 ...

  3. sobel算子原理与实践

           索贝尔算子(Sobeloperator)主要用于获得数字图像的一阶梯度,是一种离散性差分算子.它是prewitt算子的改进形式,改进之处在于sobel算子认为,邻域的像素对当前像素产生的 ...

  4. sobel算子原理_「学术论文」基于Sobel算法图像边缘检测的FPGA实现

    摘要: 针对嵌入式软件无法满足数字图像实时处理速度问题,提出用硬件加速器的思想,通过FPGA实现Sobel边缘检测算法.通过乒乓操作.并行处理数据和流水线设计,大大提高算法的处理速度.采用模块的硬件设 ...

  5. sobel算子原理与实现

    一.原理: 首先介绍背景知识: 1)边缘:灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像. 2)边缘点:图像中具有坐标[x,y],且处在强度显著变化的位置 ...

  6. sobel算子原理以及运用

    Sobel边缘检测算法: 主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量 Sobel卷积因子为: ...

  7. Sobel算子原理及matlab实现代码

    一.基本原理 Sobel算子使用梯度进行边缘增强,它考虑图像3×3邻域的处理. 对于图像f(x,y),取该图像的3×3的区域,如下图 x方向的偏微分定义为: y方向的偏微分定义为: 则梯度幅值为: S ...

  8. java求sobel算子代码_sobel算子原理及opencv源码实现

    sobel算子原理及opencv源码实现 简要描述 sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测. 原理 算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去 ...

  9. 灰度图像--图像增强 Robert算子、Sobel算子

    灰度图像--图像增强 Robert算子.Sobel算子         目录(?)[+] 开篇废话 图像梯度介绍 Robert算子 Sobel算子 代码 结果 总结 学习DIP第36天 转载请标明本文 ...

最新文章

  1. 设计模式之建造者模式(生成器模式、Builder)摘录
  2. R语言|PLS_DA分析绘图示例
  3. python获取qq好友ip_qqzeng-ip.dat IP库读取python版
  4. 7.4.6 核PCA
  5. Linux查看设备 eth,lspci grep Eth,查看Linux下的各种硬件设备是否识别或存在之用
  6. 对USB驱动程序的理解
  7. 017 在SecureCRT中安装rz小工具
  8. unity 学习记录
  9. nginx css 304 导致图片丢失_Nginx面试三连问:如何工作?负载均衡策略有哪些?如何限流?...
  10. GDI+_VB6_ARGB
  11. slk文件转换器安卓版_MP3提取转换器
  12. Audacity的替代品
  13. 明日之后无限金条服务器,明日之后:无限金条bug 你值得收藏
  14. 0.96寸OLED的使用
  15. Swiper说明及API手册说明
  16. 电脑计算机在哪里关闭杀毒模式,电脑一开杀毒软件就关闭的解决方法
  17. soot基础 -- soot中基本的对象
  18. python绘制柱状条形图
  19. MSSQL数据库的字段类型总结
  20. Windows定时开启或关闭声音音量

热门文章

  1. 让计算机开口说话教案,会说话的安全标志中班教案
  2. ClipCursor与GetClipCursor
  3. Linux系统开启端口
  4. ie如何导入html文件类型,Magicodes.IE: 导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf和Html。...
  5. Java8的GC垃圾回收(一)
  6. JS_js获取当前年月日时分
  7. 视频教程-Linux服务器运维/虚拟主机-Linux
  8. javafx_scenebuilder-2_0-windows.msi 百度云盘下载
  9. 穿越雷区--蓝桥杯笔记
  10. JAVA接入STRIPE支付教程(测试环境),STRIPE支付的调用以及STRIPE WEBHOOK回调