Marr-Hildreth 边缘检测 OpenCV C++实现
算法原理
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++实现相关推荐
- 图像边缘检测--OpenCV之cvCanny函数
图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...
- 【OpenCv】Marr算子边缘检测
Marr算子: Laplacian of a Gaussian(LOG) Marr算子是在Laplacian算子的基础上实现的,它得益于对人的视觉机理的研究,有一定的生物学和生理学意义. 由于Lapl ...
- 图像形态学变换 膨胀和腐蚀 开闭运算 边缘检测 opencv实现
一. 官方文档: dilate(膨胀): 函数原型 ↑ 参数说明 ↑ cv.erode(腐蚀)的使用和其类似. 二. 实验:膨胀和腐蚀 # Writer : wojianxinygcl@163.com ...
- Edge Detector ----------Marr Hildreth 算法
先说算法过程 1. 用Gaussian Filter平滑图像 2. 求Laplacian 二阶导 Laplacian参考http://blog.csdn.net/traumland ...
- 【C++】图像处理中的微分算子原理与实现
图像处理中的微分算子原理与实现 一阶微分边缘算子:经典算子比如:Roberts(罗伯特).Prewitt(普鲁伊特).Sobel(索贝尔),Canny(坎尼)等. 二阶微分边缘算子:Laplacian ...
- 【OpenCV图像处理入门学习教程四】基于LoG算子的图像边缘检测
OpenCV图像处理入门学习教程系列,上一篇第三篇:基于SIFT特征和SURF特征的微旋转图像拼接与融合生成全景图像的比较 LoG边缘检测算子 LoG边缘检测算子是David Courtnay Mar ...
- opencv——边缘检测算法(总结)
前言 笔记. 一.边缘检测算法 边缘检测算法是指利用灰度值的不连续性质,以灰度突变为基础分割出目标区域.对铝铸件表面进行成像后会产生一些带缺陷的区域,这些区域的灰度值比较低,与背景图像相比在灰度上会有 ...
- 在OpenCV中基于深度学习的边缘检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI算法与图像处理 导读 分析了Canny的优劣,并给出 ...
- python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)
原理 Canny边缘检测是一种常用的边缘检测算法.由 John F. Canny提出 这是一个多阶段的算法,我们将经历每个阶段. 1.降低噪音 由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高 ...
最新文章
- 幕后我最“牛” | 数据派优秀志愿者风采展
- python用matplotlib画人口图_Python+Matplotlib画contour图
- 85. Leetcode 746. 使用最小花费爬楼梯 (动态规划-基础题)
- 4e4 Coursework decomposition
- 转]一个计算机专业学生几年的Java编程经验汇总
- 不厌其烦,又一个Vue组件库
- ubuntu 通过 海康sdk调用摄像头抓图片
- 【CF#192 A】Funky Numbers (二分,查找,二元组)
- java 序列化,流,二进制的区别和联系
- C语言中报段错误(核心已转储)的常见问题
- 华为认证HCNA知识点
- 阿铭Linux_网站维护学习笔记20190305
- 邮箱发送html邮件,遇到的问题(如阿里邮箱如何发送html邮件、qq向阿里发送邮件样式丢失等)解决方法
- Python小例子 | 如何将多张图片合成mp4视频格式,并加入背景音乐...
- 计算机网络的概述以及网络的组成
- 红米9.0系统设备最完美激活XPOSED框架的教程
- 电脑桌面计算机找不到,电脑桌面没有了怎么恢复?电脑桌面没有了的恢复方法...
- 组件的生命周期,小程序如何引入第三方ui框架
- ra3录像重播工具_设置DO-RA小工具的网络销售渠道
- PHPMyWind支持PowerPoint上传
热门文章
- [推荐]如何设置微信公众号客服消息实时提醒,及在微信中回复粉丝留言
- 一篇优秀的企业活动类新闻稿是如何撰写出来?
- 基于SBO的仓储维护管理实现
- linux 下orical !)G 的安装
- 阿里云服务器包年包月收费模式常见问题汇总(官方资料解答)
- 基于java的山水房屋房产中介系统
- 激进推动2G退网迎恶果,中国联通用户数再跌,快跌穿3亿了
- 【转】android call(mo)流程介绍,【转】超详细找call写call教程
- NAC公链 区块链技术寒冬已过,优质公链NA(Nirvana)Chain开启快速发展之行
- 用Java将doc文档转成pdf格式