OpenCV——边缘检测原理

article/2025/9/15 3:52:05

边缘检测原理

图像的边缘指的是图像中像素灰度值突然发生变化的区域,如果将图像的每一行像素和每一列像素都描述成一个关于灰度值的函数,那么图像的边缘对应在灰度值函数中是函数值突然变大的区域。函数值的变化趋势可以用函数的导数描述。当函数值突然变大时,导数也必然会变大,而函数值变化较为平缓区域,导数值也比较小,因此可以通过寻找导数值较大的区域去寻找函数中突然变化的区域,进而确定图像中的边缘位置。图给出一张含有边缘的图像,图像每一行的像素灰度值变化可以用图中下方的曲线表示。
在这里插入图片描述

通过像素灰度值曲线可以看出图像边缘位于曲线变化最陡峭的区域,对灰度值曲线求取一阶导数可以得到图中所示的曲线,通过曲线可以看出曲线的最大值区域就是图像中的边缘。
在这里插入图片描述

由于图像是离散的信号,我们可以用临近的两个像素差值来表示像素灰度值函数的导数,求导形式可以用式来表示。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

 图像的边缘有可能是由高像素值变为低像素值,也有可能是由低像素值变成高像素值,通过式得到的正数值表示需要像素值突然由低变高,得到的负数值表示像素值由高到低,这两种都是图像的边缘,因此为了在图像中同时表示出这两种边缘信息,需要将计算的结果求取绝对值。

OpenCV 中提供了convertScaleAbs()函数用计算矩阵中所有数据的绝对值

void convertScaleAbs(InputArray src, OutputArray dst,double alpha = 1, double beta = 0);
  • src:输入矩阵。
  • dst:计算绝对值后输入矩阵。
  • alpha:缩放因子,默认参数为只求取绝对值不进行缩放。
  • beta:在原始数据上添加的偏值,默认参数表示不增加偏值。

 该函数可以求取矩阵中所有数据的绝对值。函数前两个参数分别为输入、输出矩阵,两个参数可以是相同的变量。函数第三个和第四个参数为对绝对值的缩放和原始数据上的偏移。

在这里插入图片描述

 图像的边缘包含X方向的边缘和Y方向的边缘,因此分别求取两个方向的边缘后,对两个方向的边缘求取并集就是整幅图像的边缘,即将图像两个方向边缘结果相加得到整幅图像的边缘信息

简单示例

//
// Created by smallflyfly on 2021/6/15.
//#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include "utils.hpp"#include <iostream>using namespace std;
using namespace cv;int main() {Mat im = imread("test.jpg", IMREAD_GRAYSCALE);if (im.empty()) {cerr << "image file read error" << endl;return -1;}resize(im, im, Size(0,0), 0.5, 0.5);Mat kernel1 = (Mat_<float>(1, 2) << 1, -1);Mat kernel2 = (Mat_<float>(1, 3) << 1, 0, -1);Mat kernel3 = (Mat_<float>(3, 1) << 1, 0, -1);Mat kernelXY = (Mat_<float>(2, 2) << 1, 0, 0, -1);Mat kernelYX = (Mat_<float>(2, 2) << 0, -1, 1, 0);// 边缘检测Mat result1, result2, result3, resultXY, resultYX;// 检测水平方向边缘filter2D(im, result1, -1, kernel1);convertScaleAbs(result1, result1);// 检测水平方向边缘filter2D(im, result2, -1, kernel2);convertScaleAbs(result2, result2);// 检测垂直方向边缘filter2D(im, result3, -1, kernel3);convertScaleAbs(result3, result3);// 整幅图像的边缘Mat result23 = result2 + result3;// 检测左上到右下的边缘filter2D(im, resultXY, -1, kernelXY);convertScaleAbs(resultXY, resultXY);// 检测右上到左下的边缘filter2D(im, resultYX, -1, kernelYX);convertScaleAbs(resultYX, resultYX);Mat resultXYYX = resultXY + resultYX;showImage("result1", result1);showImage("result2", result2);showImage("result3", result3);showImage("result23", result23);showImage("resultXY", resultXY);showImage("resultYX", resultYX);showImage("resultXYYX", resultXYYX);waitKey(0);destroyAllWindows();return 0;}

结果图


http://chatgpt.dhexx.cn/article/8J4e5p0Q.shtml

相关文章

OpenCV 边缘检测之Canny算法(代码应用)

Canny算法 Canny是边缘检测算法&#xff0c;在1986年提出的。 是一个很好的边缘检测器 很常用也很实用的图像处理方法 Canny算法步骤 消除噪声&#xff1a;高斯模糊 - GaussianBlur灰度转换 - cvtColor计算梯度 – Sobel/Scharr非最大信号抑制高低阈值输出二值图像 API&…

opencv边缘检测加提取(圆形和矩形)

因为加密了的原因&#xff0c;不好直接复制&#xff0c;大家看一下代码就好。

OpenCV之边缘检测

1.图片的高斯模糊 import cv2 import matplotlib.pyplot as pltimg cv2.imread(r"C:\Users\Curry\Desktop\goutou.png") gray cv2.cvtColor(img, codecv2.COLOR_BGR2GRAY) gray2 cv2.GaussianBlur(gray,(19,19),0) #高斯模糊 # canny cv2.Canny()cv2.imshow(gra…

OpenCV如何进行图像的边缘检测?OpenCV边缘检测操作流程

OpenCV提供了几种常见的图像边缘检测算法&#xff0c;包括Sobel算子、Scharr算子、Laplacian算子和Canny边缘检测算法。下面分别介绍这些算法及其实现方法。 Sobel算子 Sobel算子是一种常见的图像边缘检测算法&#xff0c;其原理是通过对图像进行卷积操作&#xff0c;计算出图像…

opencv-边缘检测

文章目录 一、Canny边缘检测1.1高斯滤波器2.1梯度和方向3.1非极大值抑制4.1双阈值检测 一、Canny边缘检测 Canny边缘检测器是一种被广泛使用的算法&#xff0c;并被认为是边缘检测最优的算法&#xff0c;该方法使用了比高斯差分算法更复杂的技巧&#xff0c;如多向灰度梯度和滞…

opencv边缘检测算子

实验三 边缘检测算子 一、 实验目的 利用opencv或其他工具编写实现下图的sobel算子和robert算子边缘检测 二、 实验过程 利用opencv python实现sobel算子和robert算子边缘检测 (1)在python安装opencv库 这个步骤我在第二个实验&#xff0c;图像滤波里写过了&#xff0c;就不…

OpenCV:边缘检测算法

边缘检测&#xff08;英语&#xff1a;Edge detection&#xff09;是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括&#xff08;i&#xff09;深度上的不连续、…

opencv边缘检测 roberts算子

定义roberts两个算子 分别为135度 和45度。 [1,0, 0,-1] [0,1 -1,0] 这里展示在c实现的过程。先展示下效果图 分别是45度角 135度角和边缘效果图。 #include<opencv2/opencv.hpp> #include<opencv2/core/core.hpp> #include<opencv2/imgproc/imgproc.hpp> #…

基于QT+OpenCV边缘检测、面积检测

没什么好说的就是调库&#xff0c;直接看下效果图&#xff0c;&#xff0c;基于OPENC4.5.1&#xff0c;如需要请 原图&#xff1a; 对图形进行描边并进行标号 面积检测

【学习OpenCV4】OpenCV边缘检测算法总结

本文分享内容来自图书《学习OpenCV 4&#xff1a;基于Python的算法实战》&#xff0c;该书内容如下&#xff1a; 第1章 OpenCV快速入门&#xff1b; 第2章 图像读写模块imgcodecs&#xff1b; 第3章 核心库模块core&#xff1b; 第4章 图像处理模块imgproc&#xff08;一&…

Opencv边缘检测、轮廓发现、绘制轮廓

Opencv边缘检测、轮廓发现、绘制轮廓 提取图像轮廓的2个步骤 1、 findContours函数找轮廓&#xff0c; 2、 drawContours函数画轮廓 轮廓的查找——cv::findContours() 函数cv::findContour是从二值图像中来计算轮廓的&#xff0c;它可以使用cv::Canny()函数处理的图像&am…

基于Python的Opencv边缘检测

边缘检测实际上就是对图像进行系统的梯度计算&#xff0c;包含了图像的噪声处理&#xff0c;非极大值抑制&#xff0c;双阈值检测等一系列图像处理方式&#xff0c;通过这些方式处理图像后得到图像的轮廓。这些方式在之前的博客都已经提到过i了&#xff0c;而Opencv提供了一个非…

OpenCV 边缘检测

一. 实验内容 用OpenCV对图片进行边缘检测。 二. 实验代码 //边缘检测 class Task17 { public:void deal() {Mat src_img imread("img\\1.jpg");imshow("边缘检测[原图]", src_img);Mat gray_img;cvtColor(src_img, gray_img, COLOR_BGR2GRAY);Mat out…

java-opencv边缘检测

安装opencv 导入jar包需要dll jar包在opencv\build\java目录里&#xff0c;dll文件在opencv\build\java\64x目录里 边缘检测 package opencv;import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc…

python opencv边缘检测

通过Opencv进行边缘检测可以说是十分常见了&#xff0c;接下来让我们聊一聊如何通过python opencv一步一步实现边缘检测 重要函数讲解 图片读取函数: pic cv2.imread(file_path, flagNone) 参数&#xff1a; file_path:读取的图片的路径。这里要注意如果图像不能读取(由于…

python-opencv边缘检测

9.python-opencv边缘检测 第一章 python-opencv-图片导入和显示 第二章 python-opencv图像简单处理 第三章 python-opencv图像mask掩膜处理 第四章 python-opencv图像马赛克 第五章 python-opencv人脸马赛克 第六章 python-opencv人脸检测 第七章 python-opencv图像张贴 第八章…

opencv边缘检测

边缘检测的一般步骤 滤波 边缘检测的算法对噪声很敏感&#xff0c;所以采用滤波器来改善边缘检测器的性能。 增强 增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时&#xff0c;可通过计算梯度…

14---OpenCV:图像检测之边缘检测

一、图像边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间&#xff0c;是图像分割、纹理特征和形状特征等图像分析的重要基础。图像强度的显著变化可分为&#xff1a; 阶跃变化函数&#xff0c;即图像强度在…

OpenCV学习11_边缘检测

本部分,我们将一起学习OpenCV中边缘检测的各种算子和滤波器-Canny算子、Sobel算子、Laplacian算子以及Scharr滤波器。 一、边缘检测步骤 在具体介绍之前,先来一起看看边缘检测的一般步骤。 1.【第一步】滤波 边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪…

opencv--边缘检测

opencv--边缘检测 1 边缘检测原理2 Sobel检测算子2.1 Sobel检测方法2.2 应用 3 Laplacian算子4. Canny边缘检测4.1 原理4.2应用 5 算子比较 1 边缘检测原理 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性…