还有很多 边缘检测算子,在OpenCV中没有实现代码。

所以,我们得掌握看懂算法,然后扩展 算法得能力。

比如,我已知的一些 边缘检测核心:

Kirsch 8方向算子

Robinson 8方向算子

这个时候,需要我们自己去实现这个算子。

这些算子的具体介绍,其实就是 用 8个核,进行8个方向卷积,然后选取 最大值做响应。

比如 实现 kirsch 算子

KLIB_DECL void edge_kirsch_all_direction(const Mat& grayImg, Mat& edgeImg, double scale = 1, double delta = 0) { edgeImg.create(grayImg.size(), CV_16S); edgeImg.setTo(0); ushort* pDst = (ushort*)edgeImg.data; uchar* pSrc = grayImg.data; int w = grayImg.cols; int h = grayImg.rows; vector vals(8); for(int i = 1; i< h - 1; ++i) for (int j = 1; j < w - 1; ++j) { uchar v1 = pSrc[(i - 1)*w + j - 1]; uchar v2 = pSrc[(i - 1)*w + j]; uchar v3 = pSrc[(i - 1)*w + j + 1]; uchar v4 = pSrc[ i*w + j - 1]; uchar v6 = pSrc[ i*w + j + 1]; uchar v7 = pSrc[(i + 1)*w + j - 1]; uchar v8 = pSrc[(i + 1)*w + j]; uchar v9 = pSrc[(i + 1)*w + j + 1]; vals[0] = 5 * (v1 + v2 + v3) - 3 * (v4 + v6 + v7 + v8 + v9); vals[1] = 5 * (v6 + v2 + v3) - 3 * (v4 + v1 + v7 + v8 + v9); vals[2] = 5 * (v6 + v9 + v3) - 3 * (v4 + v1 + v7 + v8 + v2); vals[3] = 5 * (v6 + v9 + v8) - 3 * (v4 + v1 + v7 + v3 + v2); vals[4] = 5 * (v7 + v9 + v8) - 3 * (v4 + v1 + v6 + v3 + v2); vals[5] = 5 * (v7 + v4 + v8) - 3 * (v9 + v1 + v6 + v3 + v2); vals[6] = 5 * (v7 + v4 + v1) - 3 * (v9 + v8 + v6 + v3 + v2); vals[7] = 5 * (v2 + v4 + v1) - 3 * (v9 + v8 + v6 + v3 + v7); int maxV = *(std::max_element(vals.begin(), vals.end())); pDst[i*w + j] = scale * maxV + delta; }}

调用的方法:

调用 Kirsch算子

同理 实现 Robinson 算子:

KLIB_DECL void edge_robinson_all_direction(const Mat& grayImg, Mat& edgeImg, double scale = 1, double delta = 0){ edgeImg.create(grayImg.size(), CV_16S); edgeImg.setTo(0); ushort* pDst = (ushort*)edgeImg.data;  uchar* pSrc = grayImg.data; int w = grayImg.cols; int h = grayImg.rows; vector vals(8); for (int i = 1; i < h - 1; ++i) for (int j = 1; j < w - 1; ++j) { uchar v1 = pSrc[(i - 1)*w + j - 1]; uchar v2 = pSrc[(i - 1)*w + j]; uchar v3 = pSrc[(i - 1)*w + j + 1]; uchar v4 = pSrc[i*w + j - 1]; uchar v6 = pSrc[i*w + j + 1]; uchar v7 = pSrc[(i + 1)*w + j - 1]; uchar v8 = pSrc[(i + 1)*w + j]; uchar v9 = pSrc[(i + 1)*w + j + 1]; vals[0] = 1 * (v1 + v3) + 2 * (v2 - v8) - 1 * (v7 + v9); vals[1] = 1 * (v2 + v6) + 2 * (v3 - v7) - 1 * (v4 + v8); vals[2] = 1 * (v3 + v9) + 2 * (v6 - v4) - 1 * (v1 + v7); vals[3] = 1 * (v6 + v8) + 2 * (v9 - v1) - 1 * (v2 + v4); vals[4] = 1 * (v7 + v9) + 2 * (v8 - v2) - 1 * (v1 + v3); vals[5] = 1 * (v4 + v8) + 2 * (v7 - v3) - 1 * (v2 + v6); vals[6] = 1 * (v1 + v7) + 2 * (v4 - v6) - 1 * (v3 + v9); vals[7] = 1 * (v2 + v4) + 2 * (v1 - v9) - 1 * (v8 + v6); int maxV = *(std::max_element(vals.begin(), vals.end())); pDst[i*w + j] = scale * maxV + delta; }}

调用的方法类似。

然后编译为一个 插件,加载到平台测试:

Krisch cast模式

Krisch abs模式

Krish nono模式

测试 Robinson算子,效果类似:

Robinson 算子 响应弱一些

这就是 其他人的博客里面 提到的 Kirsch 算子和 Robinson算子。

对比知道:

Laplace 边缘响应最弱

Sobel 边缘响应稍强

Robinson 边缘响应更强

Kirsch 边缘响应最强

希望大家学会了OpenCV之外的 边缘检测算子。

sobel算子_边缘检测算法4.-教你动手实现kirsch和robinson算子相关推荐

  1. canny算子_Canny边缘检测算法

    PS:计算机视觉课程的一项大作业,作为门外汉,在网上查找资料学习和复现时踩了一些坑,在完成作业后分享一下,希望后面的小白同学少走弯路. 1.问题描述 在计算机视觉/机器视觉领域,图像分割的应用十分普遍 ...

  2. opencv roberts算子_边缘检测 Roberts算子

    Roberts算子是一种最简单的算子,利用局部差分算子寻找边缘的算子.采用对角线相邻两像素之差近似梯度幅值检测边缘..检测垂直边缘的效果比斜向边缘要好,定位精度高,对噪声比较敏感,无法抑制噪声的影响. ...

  3. c语言sobel边缘检测,Sobel图像边沿检测算法的优化设计与实现

    0 引言 图像边沿是图像的基本特征,是图像分割.特征提取等图像分析的重要依据,目前已广泛应用于目标识别.机器视觉和运动目标跟踪等领域.现今已有多种边沿检测算法以及一些改进方式,但各种算法都有各自的优缺 ...

  4. 在CIELab颜色空间下使用八方向Sobel算子实现边缘检测

    参考河北师范大学硕士学位论文--基于八方向Sobel算子的边缘检测算法研究. 由于自己实现滤波器运算,计算速度很慢,以后有能力再进行改进. 算子定义如下: 算法思路: 1.将RGB图像转化为CIELa ...

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

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

  6. 传统经典CV算法_边缘检测概念以及常用一阶微分梯度算子

    边缘检测 图像边缘是图像最基本的特征,所谓边缘(Edge) 是指图像局部特性的不连续性.灰度或结构等信息的突变处称之为边缘.例如,灰度级的突变.颜色的突变,.纹理结构的突变等.边缘是一个区域的结束,也 ...

  7. [Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测

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

  8. 【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测

    canny边缘检测见OpenCV [七]----边缘提取算子(图像边缘提取)--canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作.一个最重要的卷积运算 ...

  9. 图像像素点赋值_医学图像处理教程(五)——医学图像边缘检测算法

    今天将给大家分享医学图像常见两种图像边缘检测算法. 1.Sobel算子操作 Sobel算子的思想,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同 ...

最新文章

  1. maven 批量docker_Spring Boot 整合 docker
  2. 又在GitHub上挖到个宝藏:Switch模拟器!
  3. NVelocity模板引擎的注意事项
  4. 中国人工智能产业发展指数重磅发布,中国声谷首批AI达摩名单揭晓
  5. 快递100接口的调用过程
  6. Redis与Memcached的对比
  7. 随想录(插件的重要思想)
  8. [Stage3D]GPU渲染的喷泉粒子
  9. 推荐一款可以在浏览器中运行的人脸识别库
  10. 一款简约大气的PHP短网址系统程序源码
  11. sublime配置go环境_如何为Sublime3配置Go语言开发环境
  12. 【PyG】文档总结以及项目经验(持续更新
  13. 第五章 澄清概念意义
  14. Android OpenSL介绍 并实现播放PCM功能
  15. JAVA版B2B2C商城源码 拼团商城 分销商城 springboot商城多商家入驻商城系统
  16. 服务器故障英文邮件,全球邮
  17. Qt5.11.2+CMake+opencv配置及问题总结
  18. EEGlab导入.mat文件
  19. html5 鼠标动画效果,7 个让人惊叹的 HTML5 鼠标动画
  20. nodejs+vue家庭菜谱食谱管理系统

热门文章

  1. 通过JAVA获取优酷视频
  2. 15款最佳的响应式 Web 设计测试工具
  3. win10+GTX1070+keras+Anaconda+python3.5安装记录
  4. Git Windows下安装配置
  5. 【解决方案】kafka: client has run out of available brokers to talk to (Is your cluster reachable?)
  6. pytorch图片数据归一化,通常传入transforms.Normalize(mean,std,inplace=False)中的mean和std是如何获取的?
  7. ppt倒计时3分钟_老板发来200页PPT文件,让我翻译成英文,3分钟教你搞定
  8. 微信小程序单指拖拽和双指缩放旋转
  9. mysql命令的依赖库_3.EZMM工程(常用shell命令,及需要用到的基本依赖库)
  10. mysql group 索引失效_介绍mysql索引失效的情况