算法原理

C++代码实现

Mat MarrEdgeDetection(Mat src, int kernelDiameter, double sigma) {int kernel_size = kernelDiameter / 2;Mat kernel(kernelDiameter, kernelDiameter, CV_64FC1);for (int i = -kernel_size; i <= kernel_size; i++) {for (int j = -kernel_size; j <= kernel_size; j++) {kernel.at<double>(i + kernel_size, j + kernel_size) = exp(-((pow(j, 2) + pow(i, 2)) /(pow(sigma, 2) * 2)))* (((pow(j, 2) + pow(i, 2) - 2 *pow(sigma, 2)) / (2 * pow(sigma, 4))));}}Mat laplacian(src.rows - kernel_size * 2, src.cols - kernel_size * 2, CV_64FC1);Mat dst = Mat::zeros(src.rows - kernel_size * 2, src.cols - kernel_size * 2, CV_8UC1);for (int i = kernel_size; i < src.rows - kernel_size; i++) {for (int j = kernel_size; j < src.cols - kernel_size; j++) {double sum = 0;for (int x = -kernel_size; x <= kernel_size; x++){for (int y = -kernel_size; y <= kernel_size; y++) {sum +=  src.at<uchar>(i + x, j + y) * kernel.at<double>(x + kernel_size, y + kernel_size);}}laplacian.at<double>(i - kernel_size, j - kernel_size) = sum;}}for (int i = 1; i < dst.rows - 1; i++) {for (int j = 1; j < dst.cols - 1; j++) {if ((laplacian.at<double>(i - 1, j) * laplacian.at<double>(i + 1, j) < 0) || (laplacian.at<double>(i, j + 1) * laplacian.at<double>(i, j - 1) < 0) ||(laplacian.at<double>(i + 1, j - 1) * laplacian.at<double>(i - 1, j + 1) < 0) || (laplacian.at<double>(i - 1, j - 1) * laplacian.at <double> (i + 1, j + 1) < 0)) {dst.at<uchar>(i, j) = 255;}}}return dst;
}
//调用Mat src = imread("F:\\1.jpg", 0);Mat dst = MarrEdgeDetection(src, 9, 1.6);

效果

原图:

结果图:

Marr-Hildreth 边缘检测 OpenCV C++实现相关推荐

  1. 图像边缘检测--OpenCV之cvCanny函数

    图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

  2. 【OpenCv】Marr算子边缘检测

    Marr算子: Laplacian of a Gaussian(LOG) Marr算子是在Laplacian算子的基础上实现的,它得益于对人的视觉机理的研究,有一定的生物学和生理学意义. 由于Lapl ...

  3. 图像形态学变换 膨胀和腐蚀 开闭运算 边缘检测 opencv实现

    一. 官方文档: dilate(膨胀): 函数原型 ↑ 参数说明 ↑ cv.erode(腐蚀)的使用和其类似. 二. 实验:膨胀和腐蚀 # Writer : wojianxinygcl@163.com ...

  4. Edge Detector ----------Marr Hildreth 算法

    先说算法过程 1. 用Gaussian Filter平滑图像 2. 求Laplacian 二阶导           Laplacian参考http://blog.csdn.net/traumland ...

  5. 【C++】图像处理中的微分算子原理与实现

    图像处理中的微分算子原理与实现 一阶微分边缘算子:经典算子比如:Roberts(罗伯特).Prewitt(普鲁伊特).Sobel(索贝尔),Canny(坎尼)等. 二阶微分边缘算子:Laplacian ...

  6. 【OpenCV图像处理入门学习教程四】基于LoG算子的图像边缘检测

    OpenCV图像处理入门学习教程系列,上一篇第三篇:基于SIFT特征和SURF特征的微旋转图像拼接与融合生成全景图像的比较 LoG边缘检测算子 LoG边缘检测算子是David Courtnay Mar ...

  7. opencv——边缘检测算法(总结)

    前言 笔记. 一.边缘检测算法 边缘检测算法是指利用灰度值的不连续性质,以灰度突变为基础分割出目标区域.对铝铸件表面进行成像后会产生一些带缺陷的区域,这些区域的灰度值比较低,与背景图像相比在灰度上会有 ...

  8. 在OpenCV中基于深度学习的边缘检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 导读 分析了Canny的优劣,并给出 ...

  9. python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)

    原理 Canny边缘检测是一种常用的边缘检测算法.由 John F. Canny提出 这是一个多阶段的算法,我们将经历每个阶段. 1.降低噪音 由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高 ...

最新文章

  1. 幕后我最“牛” | 数据派优秀志愿者风采展
  2. python用matplotlib画人口图_Python+Matplotlib画contour图
  3. 85. Leetcode 746. 使用最小花费爬楼梯 (动态规划-基础题)
  4. 4e4 Coursework decomposition
  5. 转]一个计算机专业学生几年的Java编程经验汇总
  6. 不厌其烦,又一个Vue组件库
  7. ubuntu 通过 海康sdk调用摄像头抓图片
  8. 【CF#192 A】Funky Numbers (二分,查找,二元组)
  9. java 序列化,流,二进制的区别和联系
  10. C语言中报段错误(核心已转储)的常见问题
  11. 华为认证HCNA知识点
  12. 阿铭Linux_网站维护学习笔记20190305
  13. 邮箱发送html邮件,遇到的问题(如阿里邮箱如何发送html邮件、qq向阿里发送邮件样式丢失等)解决方法
  14. Python小例子 | 如何将多张图片合成mp4视频格式,并加入背景音乐...
  15. 计算机网络的概述以及网络的组成
  16. 红米9.0系统设备最完美激活XPOSED框架的教程
  17. 电脑桌面计算机找不到,电脑桌面没有了怎么恢复?电脑桌面没有了的恢复方法...
  18. 组件的生命周期,小程序如何引入第三方ui框架
  19. ra3录像重播工具_设置DO-RA小工具的网络销售渠道
  20. PHPMyWind支持PowerPoint上传

热门文章

  1. [推荐]如何设置微信公众号客服消息实时提醒,及在微信中回复粉丝留言
  2. 一篇优秀的企业活动类新闻稿是如何撰写出来?
  3. 基于SBO的仓储维护管理实现
  4. linux 下orical !)G 的安装
  5. 阿里云服务器包年包月收费模式常见问题汇总(官方资料解答)
  6. 基于java的山水房屋房产中介系统
  7. 激进推动2G退网迎恶果,中国联通用户数再跌,快跌穿3亿了
  8. 【转】android call(mo)流程介绍,【转】超详细找call写call教程
  9. NAC公链 区块链技术寒冬已过,优质公链NA(Nirvana)Chain开启快速发展之行
  10. 用Java将doc文档转成pdf格式