OpenCV笔记:图像边缘检测Sobel,Laplace,Canny

2023-12-06 13:38

本文主要是介绍OpenCV笔记:图像边缘检测Sobel,Laplace,Canny,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

边缘提取时保留图像灰度变化剧烈的区域,从数学上,最直观的方法是微风,对于数字图像来说就是差分,从信号处理的角度来看,就是用高通滤波器,保留高频信号。以下程序用Sobel算子、Laplace算子、Canny算子实现图像的边缘检测。
注:cvSobel只用于单通道图像变换,如对彩色图像进行cvSobel处理,可分别对每一通道图像进行cvSobel,再转为彩色图像。
===============================================
01 #include "cv.h"
02 #include "cxcore.h"
03 #include "highgui.h"
04 void main()
05 {
06 IplImage * pImage=NULL;
07 IplImage * pImage8uGray=NULL;
08 IplImage * pImage8uSmooth=NULL;
09 IplImage * pImage16uGraySobel=NULL;
10 IplImage * pImage8uGraySobelShow=NULL;
11 //--------------
12 IplImage * pImagePlanes[3]={NULL,NULL,NULL};
13 IplImage * pImage16uColorSobel=NULL;
14 IplImage * pImage8uColorSobelShow=NULL;
15 //--------------
16 IplImage * pImage16uGrayLaplace=NULL;
17 IplImage * pImage8uGrayLaplaceShow=NULL;
18 //--------------
19 IplImage * pImage8uGrayCanny=NULL;
20 //==================灰度图像Sobel变换=====================
21 pImage=cvLoadImage("lena.jpg",-1);
22 pImage8uGray=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
23 pImage8uSmooth=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
24 pImage8uGraySobelShow=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
25 //转灰度
26 cvCvtColor(pImage,pImage8uGray,CV_BGR2GRAY);
27 //高斯滤波
28 cvSmooth(pImage8uGray,pImage8uSmooth,CV_GAUSSIAN,3,0,0);
29 //cvSobel要求目标图像必须是IPL_DEPTH_16S
30 pImage16uGraySobel=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1);
31 //计算一阶x方向的差分,也可以计算一阶y方向
32 cvSobel(pImage8uSmooth,pImage16uGraySobel,0,1,3);
33 //再把格式转回来,用于显示
34 cvConvertScaleAbs(pImage16uGraySobel,pImage8uGraySobelShow,1,0);
35 cvNamedWindow("灰度图像Sobel变换",CV_WINDOW_AUTOSIZE);
36 cvShowImage("灰度图像Sobel变换",pImage8uGraySobelShow);
37
38 //==================彩色图像Sobel变换=====================
39 int i;
40 for (i=0;i<3;i++)
41 {
42 pImagePlanes[i]=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
43 }
44 pImage16uColorSobel=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1);
45 pImage8uColorSobelShow=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,3);
46 //分成3个单通道
47 cvCvtPixToPlane(pImage,pImagePlanes[0],pImagePlanes[1],pImagePlanes[2],NULL);
48 for (i=0;i<3;i++)
49 {
50 cvSobel(pImagePlanes[i],pImage16uColorSobel,0,1,3);
51 cvConvertScaleAbs(pImage16uColorSobel,pImagePlanes[i],1,0);
52 }
53 cvCvtPlaneToPix(pImagePlanes[0],pImagePlanes[1],pImagePlanes[2],NULL,pImage8uColorSobelShow);
54 cvNamedWindow("彩色图像Sobel变换",CV_WINDOW_AUTOSIZE);
55 cvShowImage("彩色图像Sobel变换",pImage8uColorSobelShow);
56
57 //==================灰度图像Laplace变换=====================
58 pImage16uGrayLaplace=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1);
59 pImage8uGrayLaplaceShow=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
60 cvLaplace(pImage8uSmooth,pImage16uGrayLaplace,3);
61 cvConvertScaleAbs(pImage16uGrayLaplace,pImage8uGrayLaplaceShow,1,0);
62 cvNamedWindow("灰度图像Laplace变换",CV_WINDOW_AUTOSIZE);
63 cvShowImage("灰度图像Laplace变换",pImage8uGrayLaplaceShow);
64
65 //==================灰度图像Canny变换=====================
66 pImage8uGrayCanny=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
67 cvCanny(pImage8uSmooth,pImage8uGrayCanny,100,200,3);
68 cvNamedWindow("灰度图像Canny变换",CV_WINDOW_AUTOSIZE);
69 cvShowImage("灰度图像Canny变换",pImage8uGrayCanny);
70
71 cvWaitKey(0);
72 cvDestroyWindow("灰度图像Sobel变换");
73 cvDestroyWindow("彩色图像Sobel变换");
74 cvDestroyWindow("灰度图像Laplace变换");
75 cvReleaseImage(&pImage);
76 cvReleaseImage(&pImage8uGray);
77 cvReleaseImage(&pImage8uSmooth);
78 cvReleaseImage(&pImage16uGraySobel);
79 cvReleaseImage(&pImage8uGraySobelShow);
80 cvReleaseImage(&pImage16uColorSobel);
81 cvReleaseImage(&pImage8uColorSobelShow);
82 cvReleaseImage(&pImagePlanes[0]);
83 cvReleaseImage(&pImagePlanes[1]);
84 cvReleaseImage(&pImagePlanes[2]);
85 cvReleaseImage(&pImage16uGrayLaplace);
86 cvReleaseImage(&pImage8uGrayLaplaceShow);
87 }===============================================

===============================================
Sobel

使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分

void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );
src
输入图像.
dst
输出图像.
xorder
x 方向上的差分阶数
yorder
y 方向上的差分阶数
aperture_size
扩展 Sobel 核的大小,必须是 1, 3, 5 或 7。 除了尺寸为 1, 其它情况下, aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1的情况, 使用 3x1 或 1x3 内核 (不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。Scharr 滤波器系数是:

对 x-方向 以及转置矩阵对 y-方向。

函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分:

由于Sobel 算子结合了 Gaussian 平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通常情况,函数调用采用如下参数 (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 来计算一阶 x- 或 y- 方向的图像差分。第一种情况对应:

核。

第二种对应:

或者

核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的定义)。由于该函数不进行图像尺度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即象素的深度)。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。当然可以用函数 cvConvertScale 或 cvConvertScaleAbs 转换为 8 位的。除了 8-比特 图像,函数也接受 32-位 浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。

===============================================

Laplace

计算图像的 Laplacian 变换

void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 );
src
输入图像.
dst
输出图像.
aperture_size
核大小 (与 cvSobel 中定义一样).

函数 cvLaplace 计算输入图像的 Laplacian变换,方法是先用 sobel 算子计算二阶 x- 和 y- 差分,再求和:

dst(x,y) = d2src/dx2 + d2src/dy2

对 aperture_size=1 则给出最快计算结果,相当于对图像采用如下内核做卷积:

类似于 cvSobel 函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型的组合和cvSobel一致。

===============================================
Canny

void cvCanny( const CvArr* image, CvArr* edges, double threshold1,
double threshold2, int aperture_size=3 );
image
输入图像.
edges
输出的边缘图像
threshold1
第一个阈值
threshold2
第二个阈值
aperture_size
Sobel 算子内核大小 (见 cvSobel).
函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。

这篇关于OpenCV笔记:图像边缘检测Sobel,Laplace,Canny的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/462016

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.