1.基本原理

边缘检测一般是利用微分等方法,通过对灰度跃变的分析寻找图像上区域边缘的技术。今天的猪脚是梯度算子和Roberts算子。

1.梯度算子是怎么来的?

答:图像是一个二维集合,在(x, y)处的偏导数(也就是此点的最大变化率)可以写成下图这样,其梯度大小本为,但由于计算量大,所以简化成

2.Roberts算子是怎么来的?

答:对角线方向的梯度,其定义见下图,这个就是Roberts算子,其梯度大小本为,但由于计算量大,所以简化成

3.Sobel算子是怎么来的?(此图参考自https://blog.csdn.net/songzitea/article/details/17528089)

答:

2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解)

/*梯度法边缘检测 比例scale对差分结果进行缩放*/
QImage* MainWindow:: SideGrandiant(QImage* image,double scale)
{QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);QColor color0;QColor color1;QColor color2;int  r = 0;int g = 0;int b = 0;int rgb = 0;int r1 = 0;int g1 = 0;int b1 = 0;int rgb1 = 0;int a = 0;for( int y = 0; y < image->height() - 1; y++){for(int x = 0; x < image->width() - 1; x++){color0 =   QColor ( image->pixel(x,y));color1 =   QColor ( image->pixel(x + 1,y));color2 =   QColor ( image->pixel(x,y + 1));r = abs(color0.red() - color1.red());g = abs(color0.green() - color1.green());b = abs(color0.blue() - color1.blue());rgb = r + g + b;r1 = abs(color0.red() - color2.red());g1= abs(color0.green() - color2.green());b1 = abs(color0.blue() - color2.blue());rgb1 = r1 + g1 + b1;a = rgb + rgb1;a = a * scale;a = a>255?255:a;newImage->setPixel(x,y,qRgb(a,a,a));}}return newImage;
}/*Roberts法边缘检测 比例scale对差分结果进行缩放*/
QImage* MainWindow:: SideRobertsdiant(QImage* image,double scale)
{QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);QColor color0;QColor color1;QColor color2;QColor color3;int  r = 0;int g = 0;int b = 0;int rgb = 0;int r1 = 0;int g1 = 0;int b1 = 0;int rgb1 = 0;int a = 0;for( int y = 0; y < image->height() - 1; y++){for(int x = 0; x < image->width() - 1; x++){color0 =   QColor ( image->pixel(x,y));color1 =   QColor ( image->pixel(x + 1,y));color2 =   QColor ( image->pixel(x,y + 1));color3 =   QColor ( image->pixel(x + 1,y + 1));r = abs(color0.red() - color3.red());g = abs(color0.green() - color3.green());b = abs(color0.blue() - color3.blue());rgb = r + g + b;r1 = abs(color1.red() - color2.red());g1= abs(color1.green() - color2.green());b1 = abs(color1.blue() - color2.blue());rgb1 = r1 + g1 + b1;a = rgb + rgb1;a = a * scale;a = a>255?255:a;newImage->setPixel(x,y,qRgb(a,a,a));}}return newImage;
}/*sobel法边缘检测 比例scale对差分结果进行缩放,type表示使用那种公式 取值0或则1*/
QImage* MainWindow:: SideSobeldiant(QImage* image,double scale,int type)
{QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);QColor color0;QColor color1;QColor color2;QColor color3;QColor color4;QColor color5;QColor color6;QColor color7;QColor color8;int  r = 0;int g = 0;int b = 0;int rgb = 0;int r1 = 0;int g1 = 0;int b1 = 0;int rgb1 = 0;int a = 0;for( int y = 1; y < image->height() - 1; y++){for(int x = 1; x < image->width() - 1; x++){color0 =   QColor ( image->pixel(x,y));color1=   QColor ( image->pixel(x-1,y-1));color2 =   QColor ( image->pixel(x,y-1));color3 =   QColor ( image->pixel(x+1,y));color4 =   QColor ( image->pixel(x-1,y));color5 =   QColor ( image->pixel(x+1,y));color6 =   QColor ( image->pixel(x-1,y+1));color7=   QColor ( image->pixel(x,y+1));color8 =   QColor ( image->pixel(x+1,y+1));r = abs(color1.red() + color2.red() * 2 + color3.red() - color6.red() - color7.red() * 2 - color8.red());g = abs(color1.green() + color2.green() * 2 + color3.green() - color6.green() - color7.green() * 2 - color8.green());b = abs(color1.blue() + color2.blue() * 2 + color3.blue() - color6.blue() - color7.blue() * 2 - color8.blue());rgb = r + g + b;r1 = abs(color1.red() + color4.red() * 2 + color6.red() - color3.red() - color5.red() * 2 - color8.red());g1= abs(color1.green() + color4.green() * 2 + color6.green() - color3.green() - color5.green() * 2 - color8.green());b1 = abs(color1.blue() + color4.blue() * 2 + color6.blue() - color3.blue() - color5.blue() * 2 - color8.blue());rgb1 = r1 + g1 + b1;if(type == 0){if (rgb > rgb1)a = rgb;elsea = rgb1;}else if(type == 1){a = (rgb + rgb1)/2;}a = a * scale;a = a>255?255:a;newImage->setPixel(x,y,qRgb(a,a,a));}}return newImage;
}

3.参考资料

数字图像处理——技术详解与Visual C++实践(左飞等著),写代码与写博客的时间相差两年,至于还参考其他的资料不,我已经忘记了,如若需要,我可以补上去

图像的常规边缘检测(梯度算子、Roberts算子和Sobel算子)之c++实现(qt + 不调包)相关推荐

  1. python高斯滤波和降噪_python添加高斯噪声和椒盐噪声,实现中值滤波和均值滤波,实现Roberts算子和Sobel算子...

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验一,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验一. 由于时间紧张,代码没有进行任何优化, ...

  2. 边缘提取——Prewitt算子和Sobel算子

    目录 Prewitt算子和Sobel算子 理论介绍 编码实现(Python) debug过程 Prewitt算子和Sobel算子 理论介绍 Prewitt算子和Sobel算子也是基于一阶导数的算子. ...

  3. 图像处理——Canny算子 图像边缘检测:Canny算子、Prewitt算子和sobel算子

    https://blog.csdn.net/fengye2two/article/details/79190759 https://www.jianshu.com/p/bed4ffe996a1

  4. [Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. 图像梯度——Sobel算子和Laplacian算子

    一.Sobel算子 1.定义 Sobel算子是一种离散的微分算子,结合了高斯平滑和微分求导运算,利用局部拆分寻找边缘,计算所得的是一个梯度的近似值. Sobel算子=|左-右|/|下-上| Schar ...

  6. 数字图像处理---LOG算子和CANNY算子边缘提取(matlab)

    LOG算子和CANNY算子边缘提取 边缘的含义: 在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变.纹理结构的突变.颜色 ...

  7. python图像锐化 增强边缘_[Python图像处理]十一.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子,Schar算子...

    Roberts算子 Roberts算子即为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条.常用来处理具有陡峭的第噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更 ...

  8. 边缘检测之Sobel算子和Canny算子

    文章目录 一.Sobel 算子 1.1.什么是 Sobel 算子 1.2.原理 1.3.过程中的问题 1.4.OpenCV 实操 二.Canny 算子 2.1.原理 2.2.OpenCV 实操 三.对 ...

  9. 12-图像梯度-Scharr算子和laplacian算子

    Scharr算子 cv2.Scharr(img,cv2.CV_64F,1,0) 第一个参数:当前的图像对象名称 第二个参数:当前图像的深度,通常情况下指定为-1,表示输出和输入的深度是一样的:cv2. ...

最新文章

  1. 复习计算机网络day1-计算机网络的初步了解
  2. mqtt session保持 订阅消息_MQTT系列 | MQTT消息的发布和订阅
  3. php函数表达式,正规表达式函数_php
  4. VideoSolo Blu ray Player for Mac - 强大的蓝光播放器
  5. SharePoint 2010新特性Ribbon
  6. 一个声称南方985普通学生,前端学习10个月,秋招斩获字节跳动offer的分享!
  7. linux虚拟用户登录失败,用shell用户或虚拟用户登录pureftpd
  8. 如何用Chrome自带的截屏功能截取超过一个屏幕的网页 1
  9. 一文轻松搞懂-条件随机场CRF
  10. 写一简单kernel心得
  11. VS C++ sprintf 格式
  12. java我的世界显示合成表_我的世界:若从你的背包移除“合成表”,回到5年前,最原始状态...
  13. C语言实现二路归并排序
  14. Date 日期时间工具类,针对日期的一些常用的处理方法
  15. 塞规公差带图_工作量规公差带.ppt
  16. Word中如何自动生成、更新英文目录(使用域代码)
  17. PotPlayer 和 VLC 播放器的书签
  18. “人生搜索引擎” # Rewind
  19. 【单片机毕业设计】【mcuclub-106】智能晾衣架 | 多功能晾衣架【实物设计】
  20. JS将数组中元素放到数组首位

热门文章

  1. W ndows7怎么看不到U盘,刚装的win7系统认不到U盘怎么办
  2. “笑傲江湖II之东方不败”中诗句
  3. javase加强(七、 不可变集合、Stream、异常)
  4. 极客日报:为什么QQ比微信更受年轻人欢迎?iPhone13出现红绿双色屏;Spring Boot 2.6.1 发布
  5. CC2630 TIMAC协议栈低功耗问题
  6. 华为手机显示服务器繁忙,手机服务器繁忙
  7. thinkpad T430 :Intel 7系主板在XP下装AHCI驱动的方法
  8. 全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)
  9. 共阳极RGB LED二极管
  10. date oracle 显示毫秒_类型应用oracle如何显示毫秒?