学习资料参考:

张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.


Roberts算子

原理

使用Roberts进行边缘检测,也就是使用以下两个卷积核与图像进行分别卷积。(图中阴影部分数值为锚点所在)

注意在实际讨论中一般将相近两点的函数值差值作为斜率。如

那么上述的两个卷积核也就好理解了。类似于
f(x,y) - f(x + 1,y + 1)f(x,y) - f(x - 1,y + 1)两个函数差值。

在边缘我们知道,边缘处的像素差值较大,斜率较大。那么下列给出四种衡量标准:

程序实现
import numpy as np
import cv2
from scipy import signaldef roberts(I, _boundary='fill', _fillvalue=0):# 图像的高和宽H1, W1 = I.shape# 卷积核的大小H2, W2 = 2, 2# 卷积核1以及锚点位置R1 = np.array([[1, 0], [0, -1]], np.float32)kr1, kc1 = 0, 0# 计算full卷积IconR1 = signal.convolve2d(I, R1, mode='full', boundary=_boundary, fillvalue=_fillvalue)IconR1 = IconR1[H2 - kr1 - 1:H1 + H2 - kr1 - 1, W2 - kc1 - 1:W1 + W2 - kc1 - 1]# 卷积核2R2 = np.array([[0, 1], [-1, 0]], np.float32)# 先计算full卷积IconR2 = signal.convolve2d(I, R2, mode='full', boundary=_boundary, fillvalue=_fillvalue)# 锚点的位置kr2, kc2 = 0, 1# 根据锚点的位置截取full卷积,从而得到same卷积IconR2 = IconR2[H2 - kr2 - 1:H1 + H2 - kr2 - 1, W2 - kc2 - 1:W1 + W2 - kc2 - 1]return IconR1, IconR2if __name__ == "__main__":image = cv2.imread(r"C:\Users\1\Pictures\test.jpg", 0)cv2.imshow("imgae", image)# 卷积,边界扩充采用symmIconR1, IconR2 = roberts(image, 'symm')# 45度方向上的边缘强度的灰度级显示IconR1 = np.abs(IconR1)edge_45 = IconR1.astype(np.uint8)cv2.imshow("edge_45", edge_45)# 135度方向上的边缘强度IconR2 = np.abs(IconR2)edge_135 = IconR2.astype(np.uint8)cv2.imshow("edge_135", edge_135)# 用平方和的开方来衡量最后输出的边缘edge = np.sqrt(np.power(IconR1, 2.0) + np.power(IconR2, 2.0))edge = np.round(edge)edge[edge > 255] = 255edge = edge.astype(np.uint8)# 显示边缘cv2.imshow("edge", edge)cv2.waitKey(0)cv2.destroyAllWindows()

运行结果

综合分析输出图片可知,在edge45edge135上,轮廓较明显分别在45度方向与135度方向,而edge是两者的综合。


Prewitt算子

原理

与Roberts算子类似,prewitt算子也是两个卷积核。(并且其中带阴影部分的数字是锚点所在)

并且发现上述两个矩阵是可以进行分离的,如下所示

根据分离的结果可知, p r e w i t t x prewitt_x prewittx​算子的卷积可以分为先进行垂直方向的均值平滑,然后进行水平方向的差分。同理, p r e w i t t y prewitt_y prewitty​也可类似进行理解。

程序实现
import numpy as np
import cv2
from scipy import signaldef prewitt(I, _boundary='symm'):# prewitt_x卷积运算# 垂直方向的均值平滑ones_y = np.array([[1], [1], [1]], np.float32)i_conv_pre_x = signal.convolve2d(I, ones_y, mode='same', boundary=_boundary)# 水平方向的差分diff_x = np.array([[1, 0, -1]], np.float32)i_conv_pre_x = signal.convolve2d(i_conv_pre_x, diff_x, mode='same', boundary=_boundary)# prewitt_y卷积运算# 水平方向的均值平滑ones_x = np.array([[1], [1], [1]], np.float32)i_conv_pre_y = signal.convolve2d(I, ones_x, mode='same', boundary=_boundary)# 垂直方向的差分diff_y = np.array([[1, 0, -1]], np.float32)i_conv_pre_y = signal.convolve2d(i_conv_pre_y, diff_y, mode='same', boundary=_boundary)return i_conv_pre_x, i_conv_pre_yif __name__ == "__main__":image = cv2.imread(r"C:\Users\1\Pictures\test1.jpg", 0)cv2.imshow("imgae", image)# 卷积,边界扩充采用symmi_conv_pre_x, i_conv_pre_y = prewitt(image)# 取绝对值abs_i_conv_pre_x = np.abs(i_conv_pre_x)abs_i_conv_pre_y = np.abs(i_conv_pre_y)# 边缘强度的灰度值显示edge_x = abs_i_conv_pre_x.copy()edge_y = abs_i_conv_pre_y.copy()# 截断edge_x[edge_x > 255] = 255edge_y[edge_y > 255] = 255# 类型转换edge_x = edge_x.astype(np.uint8)edge_y = edge_y.astype(np.uint8)cv2.imshow("edge_x", edge_x)cv2.imshow("edge_y", edge_y)# 求解边缘强度edge = 0.5 * i_conv_pre_x + 0.5 * i_conv_pre_yedge[edge > 255] = 255# 显示边缘edge = edge.astype(np.uint8)cv2.imshow("edge", edge)cv2.waitKey(0)cv2.destroyAllWindows()

运行结果


Opencv之边缘检测卷积算子(roberts与prewitt)相关推荐

  1. 边缘检测 从Roberts到Canny算子

    恰逢培训及前一段时间利用边缘方面知识开发项目,整理了相关知识作为培训材料,很久没写博了,知识还是需要梳理. 一.边缘的重要性 边缘在图像处理中的重要性不言而喻.当前AI最高端技术莫过于深度学习,而图像 ...

  2. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)

    目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...

  3. [Python从零到壹] 五十七.图像增强及运算篇之图像锐化Roberts、Prewitt算子实现边缘检测

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. Matlab图像边缘检测Roberts\Sobel\Prewitt\Canny算子

    确定图像中的物体边界的一种方法是先检测每个像素和其直接淋雨的状态已决定该像素是否确实处于一个物体的边界上.具有这种特性的像素被标记为边缘点.当图像中各个像素的灰度级用来反映各像素要求的程度时,这种图像 ...

  5. 【图像处理】基于matlab边缘检测 Sobel、Roberts、Prewitt

    matlab边缘检测 Sobel.Roberts.Prewitt 一.Sobel边缘检测算法 1.算法简介 2.matlab实现 3.Sobel检测结果 二.Roberts边缘检测算法 1.算法简介 ...

  6. Roberts、Prewitt、Sobel、Laplacian、LoG 和 Canny 边缘检测算子(MATLAB自写函数实现)

    文章目录 Roberts.Prewitt.Sobel.Laplacian.LoG 和 Canny 边缘检测算子(MATLAB自写函数实现) 1理论 1.1 知识引入 1.1.1 图像边缘边缘[1] 1 ...

  7. Python图像锐化及边缘检测(Roberts、Prewitt、Sobel、Lapllacian、Canny、LOG)

    目录 图像锐化概述 算法方法介绍 代码实现 效果展示 图像锐化概述 图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处 ...

  8. 梯度与边缘检测常用算子:Roberts、Prewitt、Sobel、LOG,Canny、Lapacian算子

    原文:https://blog.csdn.net/swj110119/article/details/51777422 原文:https://blog.csdn.net/gdut2015go/arti ...

  9. OpenCV 笔记 -- 边缘检测(Sobel、Laplace、Canny)

    OpenCV 笔记 – 边缘检测(Sobel.Laplace.Canny) 参考文档 一.Sobel 算子 1.简介 Sobel 算子是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度近似值.在 ...

最新文章

  1. 12 Java面向对象之多态
  2. redis 用setbit(bitmap)统计活跃用户
  3. c++tcp接收文件缓存多大合适_必知必会的TCP/IP知识
  4. mysql不被其他ip访问_mysql数据库无法被其他ip访问的问题
  5. JSP、EL和JSTL-学习笔记03【EL介绍和运算符、EL获取域中存储的数据】
  6. 灰度图像的腐蚀与膨胀
  7. Java 网络通信必备之socket通信基本原理介绍
  8. android--------volley之网络请求和图片加载
  9. P1537 弹珠 背包可行性dp
  10. 装载服务器安装和配置_一站式解决方案
  11. 支付业务与技术架构学习总结(8)——支付系统设计包含:账户,对账,风控...
  12. pp-tracking ubuntu 18.04使用GPU推理出现Segmentation fault
  13. 大型架构.net平台篇(WEB层均衡负载nginx)
  14. 安卓rom制作教程_OPPO Reno安卓9系统如何升级ColorOS6.7最新版本-安卓10系统
  15. re2正则表达式引擎学习(一)
  16. 第六章 网上银行与电子支付-1
  17. OpenStack云平台搭建(3) | 部署Glance
  18. MySQL事务相关知识
  19. Android培训班
  20. 郭炜-C语言程序设计-程序设计与算法(一)-第二周

热门文章

  1. 【那些年我们一起看过的论文】之《ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation》
  2. 2022年应届大学毕业生就业分析报告
  3. 360卫士 是 木马?
  4. Flink系列文档-(YY08)-Flink核心概念
  5. 物联网数据卡系统源码——物联网的主要应用领域
  6. android 粗体字体下载,徐静蕾加粗字体
  7. 软件开发之版本控制方式
  8. MySQL连接Navicat
  9. 卡尔曼滤波理论小释之卡尔曼增益
  10. STM32F4---通用定时器更新中断