边缘检测

一般步骤

canny算子



步骤



canny函数

彩色canny
  1. #include<opencv2/opencv.hpp>
  2. #include<opencv2/highgui/highgui.hpp>
  3. #include<opencv2/imgproc/imgproc.hpp>
  4. using namespace cv;
  5. int main()
  6. {
  7. Mat dst, edge, gray;
  8. Mat src = imread("G://2.jpg");
  9. Mat src1 = src.clone();
  10. imshow("原始图", src);
  11. dst.create(src1.size(), src1.type());
  12. cvtColor(src1, gray, COLOR_BGR2GRAY);
  13. blur(gray, edge, Size(3,3));
  14. Canny(edge, edge, 3, 9, 3);
  15. dst = Scalar::all(0);
  16. src1.copyTo(dst, edge);
  17. imshow("效果图",dst);
  18. waitKey(0);
  19. return 0;
  20. }



copyTo函数

image.copyTo(imageROI)。作用是把image的内容复制粘贴到imageROI上;

image.copyTo(imageROI,mask)。 作用是把mask和image重叠以后把mask中像素值为0(black)的点对应的image中的点变为透明,而保留其他点。

sobel算子

计算过程



Sobel函数()









实例程序


  1. //-----------------------------------【头文件包含部分】---------------------------------------
  2. // 描述:包含程序所依赖的头文件
  3. //----------------------------------------------------------------------------------------------
  4. #include <opencv2/opencv.hpp>
  5. #include<opencv2/highgui/highgui.hpp>
  6. #include<opencv2/imgproc/imgproc.hpp>
  7. //-----------------------------------【命名空间声明部分】---------------------------------------
  8. // 描述:包含程序所使用的命名空间
  9. //-----------------------------------------------------------------------------------------------
  10. using namespace cv;
  11. //-----------------------------------【main( )函数】--------------------------------------------
  12. // 描述:控制台应用程序的入口函数,我们的程序从这里开始
  13. //-----------------------------------------------------------------------------------------------
  14. int main()
  15. {
  16. //【0】创建 grad_x 和 grad_y 矩阵
  17. Mat grad_x, grad_y;
  18. Mat abs_grad_x, abs_grad_y, dst;
  19. //【1】载入原始图
  20. Mat src = imread("1.jpg"); //工程目录下应该有一张名为1.jpg的素材图
  21. //【2】显示原始图
  22. imshow("【原始图】sobel边缘检测", src);
  23. //【3】求 X方向梯度
  24. Sobel(src, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
  25. convertScaleAbs(grad_x, abs_grad_x);
  26. imshow("【效果图】 X方向Sobel", abs_grad_x);
  27. //【4】求Y方向梯度
  28. Sobel(src, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
  29. convertScaleAbs(grad_y, abs_grad_y);
  30. imshow("【效果图】Y方向Sobel", abs_grad_y);
  31. //【5】合并梯度(近似)
  32. addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
  33. imshow("【效果图】整体方向Sobel", dst);
  34. waitKey(0);
  35. return 0;
  36. }

Laplacian算子(二阶导数)





示例程序

  1. #include <opencv2/opencv.hpp>
  2. #include<opencv2/highgui/highgui.hpp>
  3. #include<opencv2/imgproc/imgproc.hpp>
  4. using namespace cv;
  5. //-----------------------------------【main( )函数】--------------------------------------------
  6. // 描述:控制台应用程序的入口函数,我们的程序从这里开始
  7. //-----------------------------------------------------------------------------------------------
  8. int main()
  9. {
  10. //【0】变量的定义
  11. Mat src, src_gray, dst, abs_dst;
  12. //【1】载入原始图
  13. src = imread("1.jpg"); //工程目录下应该有一张名为1.jpg的素材图
  14. //【2】显示原始图
  15. imshow("【原始图】图像Laplace变换", src);
  16. //【3】使用高斯滤波消除噪声
  17. GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
  18. //【4】转换为灰度图
  19. cvtColor(src, src_gray, COLOR_RGB2GRAY);
  20. //【5】使用Laplace函数
  21. Laplacian(src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
  22. //【6】计算绝对值,并将结果转换成8位
  23. convertScaleAbs(dst, abs_dst);
  24. //【7】显示效果图
  25. imshow("【效果图】图像Laplace变换", abs_dst);
  26. waitKey(0);
  27. return 0;
  28. }

scharr滤波器








  1. //---------------------------------【头文件、命名空间包含部分】----------------------------
  2. // 描述:包含程序所使用的头文件和命名空间
  3. //------------------------------------------------------------------------------------------------
  4. #include <opencv2/opencv.hpp>
  5. #include<opencv2/highgui/highgui.hpp>
  6. #include<opencv2/imgproc/imgproc.hpp>
  7. using namespace cv;
  8. //-----------------------------------【main( )函数】--------------------------------------------
  9. // 描述:控制台应用程序的入口函数,我们的程序从这里开始
  10. //-----------------------------------------------------------------------------------------------
  11. int main( )
  12. {
  13. //【0】创建 grad_x 和 grad_y 矩阵
  14. Mat grad_x, grad_y;
  15. Mat abs_grad_x, abs_grad_y,dst;
  16. //【1】载入原始图
  17. Mat src = imread("1.jpg"); //工程目录下应该有一张名为1.jpg的素材图
  18. //【2】显示原始图
  19. imshow("【原始图】Scharr滤波器", src);
  20. //【3】求 X方向梯度
  21. Scharr( src, grad_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT );
  22. convertScaleAbs( grad_x, abs_grad_x );
  23. imshow("【效果图】 X方向Scharr", abs_grad_x);
  24. //【4】求Y方向梯度
  25. Scharr( src, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT );
  26. convertScaleAbs( grad_y, abs_grad_y );
  27. imshow("【效果图】Y方向Scharr", abs_grad_y);
  28. //【5】合并梯度(近似)
  29. addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );
  30. //【6】显示效果图
  31. imshow("【效果图】合并梯度后Scharr", dst);
  32. waitKey(0);
  33. return 0;
  34. }

综合实例

  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/imgproc/imgproc.hpp>
  3. using namespace cv;
  4. //-----------------------------------【全局变量声明部分】--------------------------------------
  5. // 描述:全局变量声明
  6. //-----------------------------------------------------------------------------------------------
  7. //原图,原图的灰度版,目标图
  8. Mat g_srcImage, g_srcGrayImage, g_dstImage;
  9. //Canny边缘检测相关变量
  10. Mat g_cannyDetectedEdges;
  11. int g_cannyLowThreshold = 1;//TrackBar位置参数
  12. //Sobel边缘检测相关变量
  13. Mat g_sobelGradient_X, g_sobelGradient_Y;
  14. Mat g_sobelAbsGradient_X, g_sobelAbsGradient_Y;
  15. int g_sobelKernelSize = 1;//TrackBar位置参数
  16. //Scharr滤波器相关变量
  17. Mat g_scharrGradient_X, g_scharrGradient_Y;
  18. Mat g_scharrAbsGradient_X, g_scharrAbsGradient_Y;
  19. //-----------------------------------【全局函数声明部分】--------------------------------------
  20. // 描述:全局函数声明
  21. //-----------------------------------------------------------------------------------------------
  22. static void ShowHelpText();
  23. static void on_Canny(int, void*);//Canny边缘检测窗口滚动条的回调函数
  24. static void on_Sobel(int, void*);//Sobel边缘检测窗口滚动条的回调函数
  25. void Scharr();//封装了Scharr边缘检测相关代码的函数
  26. //-----------------------------------【main( )函数】--------------------------------------------
  27. // 描述:控制台应用程序的入口函数,我们的程序从这里开始
  28. //-----------------------------------------------------------------------------------------------
  29. int main(int argc, char** argv)
  30. {
  31. //改变console字体颜色
  32. system("color 2F");
  33. //显示欢迎语
  34. ShowHelpText();
  35. //载入原图
  36. g_srcImage = imread("1.jpg");
  37. if (!g_srcImage.data) { printf("Oh,no,读取srcImage错误~! \n"); return false; }
  38. //显示原始图
  39. namedWindow("【原始图】");
  40. imshow("【原始图】", g_srcImage);
  41. // 创建与src同类型和大小的矩阵(dst)
  42. g_dstImage.create(g_srcImage.size(), g_srcImage.type());
  43. // 将原图像转换为灰度图像
  44. cvtColor(g_srcImage, g_srcGrayImage, COLOR_BGR2GRAY);
  45. // 创建显示窗口
  46. namedWindow("【效果图】Canny边缘检测", WINDOW_AUTOSIZE);
  47. namedWindow("【效果图】Sobel边缘检测", WINDOW_AUTOSIZE);
  48. // 创建trackbar
  49. createTrackbar("参数值:", "【效果图】Canny边缘检测", &g_cannyLowThreshold, 120, on_Canny);
  50. createTrackbar("参数值:", "【效果图】Sobel边缘检测", &g_sobelKernelSize, 3, on_Sobel);
  51. // 调用回调函数
  52. on_Canny(0, 0);
  53. on_Sobel(0, 0);
  54. //调用封装了Scharr边缘检测代码的函数
  55. Scharr();
  56. //轮询获取按键信息,若按下Q,程序退出
  57. while ((char(waitKey(1)) != 'q')) {}
  58. return 0;
  59. }
  60. //-----------------------------------【ShowHelpText( )函数】----------------------------------
  61. // 描述:输出一些帮助信息
  62. //----------------------------------------------------------------------------------------------
  63. static void ShowHelpText()
  64. {
  65. //输出欢迎信息和OpenCV版本
  66. printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
  67. printf("\n\n ----------------------------------------------------------------------------\n");
  68. //输出一些帮助信息
  69. printf("\n\n\t运行成功,请调整滚动条观察图像效果~\n\n"
  70. "\t按下“q”键时,程序退出。\n");
  71. }
  72. //-----------------------------------【on_Canny( )函数】----------------------------------
  73. // 描述:Canny边缘检测窗口滚动条的回调函数
  74. //-----------------------------------------------------------------------------------------------
  75. void on_Canny(int, void*)
  76. {
  77. // 先使用 3x3内核来降噪
  78. blur(g_srcGrayImage, g_cannyDetectedEdges, Size(3, 3));
  79. // 运行我们的Canny算子
  80. Canny(g_cannyDetectedEdges, g_cannyDetectedEdges, g_cannyLowThreshold, g_cannyLowThreshold * 3, 3);
  81. //先将g_dstImage内的所有元素设置为0
  82. g_dstImage = Scalar::all(0);
  83. //使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
  84. g_srcImage.copyTo(g_dstImage, g_cannyDetectedEdges);
  85. //显示效果图
  86. imshow("【效果图】Canny边缘检测", g_dstImage);
  87. }
  88. //-----------------------------------【on_Sobel( )函数】----------------------------------
  89. // 描述:Sobel边缘检测窗口滚动条的回调函数
  90. //-----------------------------------------------------------------------------------------
  91. void on_Sobel(int, void*)
  92. {
  93. // 求 X方向梯度
  94. Sobel(g_srcImage, g_sobelGradient_X, CV_16S, 1, 0, (2 * g_sobelKernelSize + 1), 1, 1, BORDER_DEFAULT);
  95. convertScaleAbs(g_sobelGradient_X, g_sobelAbsGradient_X);//计算绝对值,并将结果转换成8位
  96. // 求Y方向梯度
  97. Sobel(g_srcImage, g_sobelGradient_Y, CV_16S, 0, 1, (2 * g_sobelKernelSize + 1), 1, 1, BORDER_DEFAULT);
  98. convertScaleAbs(g_sobelGradient_Y, g_sobelAbsGradient_Y);//计算绝对值,并将结果转换成8位
  99. // 合并梯度
  100. addWeighted(g_sobelAbsGradient_X, 0.5, g_sobelAbsGradient_Y, 0.5, 0, g_dstImage);
  101. //显示效果图
  102. imshow("【效果图】Sobel边缘检测", g_dstImage);
  103. }
  104. //-----------------------------------【Scharr( )函数】----------------------------------
  105. // 描述:封装了Scharr边缘检测相关代码的函数
  106. //-----------------------------------------------------------------------------------------
  107. void Scharr()
  108. {
  109. // 求 X方向梯度
  110. Scharr(g_srcImage, g_scharrGradient_X, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);
  111. convertScaleAbs(g_scharrGradient_X, g_scharrAbsGradient_X);//计算绝对值,并将结果转换成8位
  112. // 求Y方向梯度
  113. Scharr(g_srcImage, g_scharrGradient_Y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
  114. convertScaleAbs(g_scharrGradient_Y, g_scharrAbsGradient_Y);//计算绝对值,并将结果转换成8位
  115. // 合并梯度
  116. addWeighted(g_scharrAbsGradient_X, 0.5, g_scharrAbsGradient_Y, 0.5, 0, g_dstImage);
  117. //显示效果图
  118. imshow("【效果图】Scharr滤波器", g_dstImage);
  119. }

opencv 5 图像转换(1 边缘检测)的更多相关文章

  1. opencv 5 图像转换(3 重映射 仿射变换 直方图均衡化)

    重映射 实现重映射(remap函数) 基础示例程序:基本重映射 //---------------------------------[头文件.命名空间包含部分]------------------- ...

  2. opencv 5 图像转换(2 霍夫变换)

    霍夫线变换 标准霍夫变换和多尺度霍夫变换(HoughLines()函数) 实例: #include <opencv2/opencv.hpp> #include <opencv2/im ...

  3. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  4. 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中

    //从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...

  5. 【转】OpenCV与CxImage转换(IplImage)、IplImage QImage Mat 格式互转

    最近由于在项目中用到了Opencv库,但是为了更好的显示图像还是使用了Cximage库,它可以快捷地存取.显示.转换各种图像.Opencv库用于高级图像处理与识别.为了使Cximage图像与Openc ...

  6. OpenCV 的颜色空间转换

    # coding: utf-8 ''' 第13章主要介绍:颜色空间转换 ''' import cv2 import numpy as np ''' 经常用到的颜色空间转换是: BGR<-> ...

  7. 12、OpenCV实现图像的直方图处理

    1.直方图 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度 ...

  8. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

  9. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

随机推荐

  1. static self 区别与总结

    <?php /** * static self 区别与总结 * 总结: * 1.在 PHP 里,在没有继承时候,你用self::class 和 static::class是一样的,都是获取当前类 ...

  2. 玩转OneNET物联网平台之MQTT服务② —— 远程控制LED

    1.理论基础     参考博主线上博文: 玩转PubSubClient MQTT库 玩转OneNET物联网平台之简介 玩转OneNET物联网平台之MQTT服务① 2.远程控制LED 2.1 实验材料 ...

  3. 你必须知道的容器监控 (2) cAdvisor

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇我们了解了docker自带的监控子命令以及开源监控工具Weave Scop ...

  4. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  5. OptimalSolution(5)--数组和矩阵问题(1)简单

    一.转圈打印矩阵 题目:给定一个整型矩阵matrix,按照转圈的方式打印它. 要求:额外空间复杂度为O(1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为: ...

  6. Docker在Linux上 基本使用

    简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任 ...

  7. vue学习笔记(一)入门

    前言 随着前端不断的壮大,许多公司对于前端开发者的需求也越来越多了,作为一名优秀的前端工程师,如果连vue和react都不会的话,那真是out了,为什么那么说呢?这是我在招聘网站上截的一张图,十家公司 ...

  8. 在VMware下通过挂载系统光盘搭建本地yum仓库的方法

    一.虚拟机的安装 首先你要有一个VMware虚拟机,没有软件的朋友可以看我的前几篇博客 安装VMware虚拟机 二.进入虚拟机(在这里我们进入一个Linux虚拟机下的CentOS操作系统进行演示) 首 ...

  9. NOIP模拟 35

    int乘爆见祖宗 难得地T3暴力打满 T1T2思路也都正确 然而T2没看出一个int乘爆直接滚粗.. 这谁抗的住啊... 跟天皇说我差点就rank1了 换来的只有一张奸笑的大脸和一堆垃圾的嘲讽 真巨啊 ...

  10. Apache服务部署静态网站

    Web网络服务也叫WWW(World Wide Web),一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务. 目前提供WEB网络服务的程序有Apache.Nginx或IIS等等,Web网站服 ...