JavaCV 图像边缘检测 之 Sobel算子 算法

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。

在这里插入图片描述


在这里插入图片描述

JavaCV 边缘检测之 Sobel 算子

图像处理在众多领域都有着广泛的应用,如计算机视觉医学影像安防监控等。边缘检测作为图像处理中的一个重要环节,其目的是提取图像中的边缘信息,以便更好地理解图像的内容结构。边缘通常是图像中灰度值发生剧烈变化的地方,它可以反映出物体的轮廓纹理等特征。

传统的边缘检测方法主要有基于一阶导数的边缘检测算子和基于二阶导数的边缘检测算子。其中,基于一阶导数的边缘检测算子包括 Sobel 算子Roberts 算子Prewitt 算子等;基于二阶导数的边缘检测算子包括 Laplacian 算子、LoG 算子等。这些算子各有优缺点,适用于不同的应用场景。

JavaCV 是一个基于 Java 的计算机视觉库,它提供了对 OpenCVFFmpeg 等库的封装,使得在 Java 环境中进行图像处理和视频处理变得更加容易。JavaCV 中的 Sobel 算子实现了对图像的边缘检测功能,为我们提供了一种高效、便捷的边缘检测方法。

引言

在图像处理领域,边缘检测是一项基础且至关重要的任务。图像中的边缘包含了丰富的信息,例如物体的轮廓区域的边界等。通过准确地检测边缘,我们能够更好地对图像进行分析、识别和理解。

边缘检测在众多领域都有着广泛的应用。在计算机视觉中,对于目标识别跟踪,边缘信息可以帮助我们快速定位目标的大致形状和位置。在医学图像处理方面,边缘检测有助于医生识别病变组织的边界,辅助诊断疾病。在工业检测中,能够检测产品的边缘以判断产品的形状是否符合标准等。

目前,存在多种边缘检测的方法,而Sobel算子是其中一种经典且高效的算法。Sobel算子基于一阶导数来近似计算图像的边缘。它通过特定的卷积核对图像在水平和垂直方向分别进行计算,从而得到每个像素点在这两个方向上的梯度值,再根据设定的阈值确定该像素点是否为边缘点。这种方法计算相对简单,并且在对实时性要求较高的场景下表现出色。

在本文中,我们将深入探讨JavaCV中如何利用Sobel算子进行边缘检测,包括相关的技术实现、代码示例以及实际案例分析等内容。

一、目录

  1. Sobel 算子的原理
  2. JavaCV 简介及 Maven 依赖
  3. Sobel 算子在 JavaCV 中的实现步骤
  4. 案例展示与对比分析
  5. 中值滤波的核心思想和原理
  6. 总结
  7. 参考资料文献

二、Sobel 算子的原理

2.1 一阶导数与边缘检测

  • 在图像处理中,边缘通常被定义为图像中灰度值发生急剧变化的地方。而一阶导数可以很好地反映这种灰度值的变化。对于一个二维图像函数 f ( x , y ) f(x,y) f(x,y),其在 x x x y y y 方向上的一阶偏导数分别为 ∂ f ∂ x \frac{\partial f}{\partial x} xf ∂ f ∂ y \frac{\partial f}{\partial y} yf。当图像中的某个像素点在某个方向上的一阶导数较大时,说明该点处的灰度值变化较大,很可能是边缘点。

2.2 Sobel 算子的卷积核

  • Sobel 算子使用两个 3x3 的卷积核来计算图像在水平和垂直方向上的一阶导数近似值。这两个卷积核分别为:
    • 水平方向卷积核: [ − 1 0 1 − 2 0 2 − 1 0 1 ] \begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix} 121000121 。这个卷积核通过与图像进行卷积操作,可以计算出图像在水平方向上的灰度变化率。
    • 垂直方向卷积核: [ − 1 − 2 − 1 0 0 0 1 2 1 ] \begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix} 101202101 。同样,这个卷积核用于计算图像在垂直方向上的灰度变化率。

2.3 梯度值的计算与边缘判断

- 对于图像中的一个像素点$(x,y)$,其在水平和垂直方向上的梯度值可以分别表示为:

G x ( x , y ) = ∑ i = − 1 1 ∑ j = − 1 1 G x ( i , j ) ⋅ f ( x + i , y + j ) G_x(x,y)=\sum_{i=-1}^{1}\sum_{j=-1}^{1}G_x(i,j)\cdot f(x+i,y+j) Gx(x,y)=i=11j=11Gx(i,j)f(x+i,y+j)
G y ( x , y ) = ∑ i = − 1 1 ∑ j = − 1 1 G y ( i , j ) ⋅ f ( x + i , y + j ) G_y(x,y)=\sum_{i=-1}^{1}\sum_{j=-1}^{1}G_y(i,j)\cdot f(x+i,y+j) Gy(x,y)=i=11j=11Gy(i,j)f(x+i,y+j)
- 其中, G x ( i , j ) G_x(i,j) Gx(i,j) G y ( i , j ) G_y(i,j) Gy(i,j)分别表示水平和垂直方向的卷积核, f ( x + i , y + j ) f(x+i,y+j) f(x+i,y+j)表示像素点 ( x + i , y + j ) (x+i,y+j) (x+i,y+j)的灰度值。
- 得到水平和垂直方向的梯度值后,可以计算该像素点的梯度幅值和方向:
G ( x , y ) = G x ( x , y ) 2 + G y ( x , y ) 2 G(x,y)=\sqrt{G_x(x,y)^2+G_y(x,y)^2} G(x,y)=Gx(x,y)2+Gy(x,y)2
θ ( x , y ) = arctan ⁡ G y ( x , y ) G x ( x , y ) \theta(x,y)=\arctan\frac{G_y(x,y)}{G_x(x,y)} θ(x,y)=arctanGx(x,y)Gy(x,y)
- 最后,根据一定的阈值判断该像素点是否为边缘点。如果梯度幅值大于阈值,则该像素点被认为是边缘点;否则,该像素点被认为是非边缘点。

三、JavaCV 简介及 Maven 依赖

3.1 JavaCV 简介

  • JavaCV 是一个基于 OpenCV 和 FFmpeg 的 Java 计算机视觉库。它提供了对各种计算机视觉算法和图像处理功能的访问,包括图像读取、处理、显示,以及视频处理等。
  • JavaCV 封装了底层的 C/C++ 库,使得在 Java 中进行计算机视觉开发更加方便快捷。

3.2 Maven 依赖

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.7</version>
</dependency>

四、Sobel 算子在 JavaCV 中的实现步骤

4.1 导入必要的库

import org.bytedeco.javacpp.Loader;
import org.bytedeco.opencv.opencv_java;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

4.2 加载 OpenCV 库

Loader.load(opencv_java.class);

4.3 读取图像

String imagePath = "D:/image.jpg";
Mat image = Imgcodecs.imread(imagePath);

4.4 转换为灰度图像

Mat grayImage = new Mat();
Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);

4.5 应用 Sobel 算子进行边缘检测

  • 计算水平方向的梯度:
Mat sobelX = new Mat();
Imgproc.Sobel(grayImage, sobelX, CvType.CV_16S, 1, 0);
  • 计算垂直方向的梯度:
Mat sobelY = new Mat();
Imgproc.Sobel(grayImage, sobelY, CvType.CV_16S, 0, 1);

4.6 转换为 8 位无符号整数

Mat absSobelX = new Mat();
Mat absSobelY = new Mat();
Core.convertScaleAbs(sobelX, absSobelX);
Core.convertScaleAbs(sobelY, absSobelY);

4.7 合并水平和垂直方向的边缘图像

Mat sobelImage = new Mat();
Core.addWeighted(absSobelX, 0.5, absSobelY, 0.5, 0, sobelImage);

4.8 保存结果图像

Imgcodecs.imwrite("D:/output.jpg", sobelImage);

4.9 完整代码示例如下


        
        // 加载 OpenCV 库
        Loader.load(opencv_java.class);
        
        // 读取图像
        Mat image = Imgcodecs.imread("D:\\1730625309089.png");

        // 转换为灰度图像
        Mat grayImage = new Mat();
        Imgproc.cvtColor(image, grayImage, Imgproc.COLOR_BGR2GRAY);

        // 应用 Sobel 算子进行边缘检测
        Mat sobelX = new Mat();
        Mat sobelY = new Mat();
        Imgproc.Sobel(grayImage, sobelX, CvType.CV_16S, 1, 0);
        Imgproc.Sobel(grayImage, sobelY, CvType.CV_16S, 0, 1);

        // 转换为 8 位无符号整数
        Mat absSobelX = new Mat();
        Mat absSobelY = new Mat();
        Core.convertScaleAbs(sobelX, absSobelX);
        Core.convertScaleAbs(sobelY, absSobelY);

        // 合并水平和垂直方向的边缘图像
        Mat sobelImage = new Mat();
        Core.addWeighted(absSobelX, 0.5, absSobelY, 0.5, 0, sobelImage);


        // 保存结果图像
        Imgcodecs.imwrite("D:\\1730625309089-1.png", sobelImage);
    

五、案例展示与对比分析

5.1 准备案例图像

  • 选择一张具有明显边缘特征的图像,如图 1 所示,它是一张风景照片,描述一下原始图像的内容,如这是一张包含山脉河流树木的风景照片,画面整体色彩丰富,山脉的轮廓较为柔和,河流蜿蜒穿过画面,树木分布在山脉和河流周围等。

在这里插入图片描述图 1

5.2 应用 Sobel 算子进行边缘检测

  • 使用上述代码对案例图像进行边缘检测。得到边缘检测后的图像,如图 2 所示,经过Sobel算子边缘检测后,图像中的山脉轮廓、河流的边界以及树木的边缘都被清晰地检测出来。山脉的轮廓变得更加硬朗,河流的边界线条分明,树木的边缘也被准确地勾勒出来,整个图像以黑白二值化的形式呈现,白色部分表示检测到的边缘,黑色部分表示非边缘区域等。 在这里插入图片描述图 2

5.3 对比分析

  • 观察原始图像和边缘检测后的图像,可以明显看到 Sobel 算子成功地检测出了图像中的边缘。
  • 在原始图像中,物体的轮廓和区域边界并不明显。而经过 Sobel 算子处理后,边缘被清晰地凸显出来,使得我们可以更容易地识别物体的形状和结构。
  • 分析不同阈值对边缘检测结果的影响。当阈值较低时,可能会检测出较多的噪声边缘;当阈值较高时,可能会丢失一些较弱的边缘。

六、中值滤波的核心思想和原理

6.1 核心思想

  • 中值滤波是一种非线性滤波方法,它的核心思想是用像素点邻域内的中值来代替该像素点的值。这种方法可以有效地去除图像中的噪声,同时保留图像的边缘和细节信息。

6.2 原理

  • 对于图像中的每个像素点,选择一个邻域窗口(通常是一个矩形区域)。
  • 将邻域窗口内的所有像素值进行排序。
  • 取排序后的中间值作为该像素点的新值。
  • 通过对图像中的每个像素点进行上述操作,可以得到经过中值滤波处理后的图像。

中值滤波的优点在于它对脉冲噪声(如椒盐噪声)具有很好的去除效果,同时能够较好地保留图像的边缘和细节信息。这是因为中值滤波是基于排序操作的,它不会像线性滤波方法那样对所有像素值进行加权平均,因此不会模糊图像的边缘。

然而,中值滤波也有一些局限性。例如,对于较大的邻域窗口,中值滤波的计算量较大,可能会导致处理速度较慢。此外,中值滤波对于某些类型的噪声(如高斯噪声)的去除效果不如线性滤波方法。

七、总结

本文详细介绍了 JavaCV 中的 Sobel 算子在边缘检测中的应用。从 Sobel 算子的原理出发,阐述了一阶导数与边缘检测的关系,以及 Sobel 算子卷积核边缘检测过程。接着介绍了 JavaCV 的简介和 Maven 依赖,为读者提供了在 Java 项目中使用 JavaCV 的方法。然后,通过详细的代码示例展示了 Sobel 算子在 JavaCV 中的实现步骤,并通过案例展示与对比分析,让读者直观地了解了 Sobel 算子的效果。同时,还介绍了中值滤波的核心思想和原理,以及它在图像处理中的应用。最后,总结了 Sobel 算子的优点和局限性,为读者在实际应用中选择合适的边缘检测算法提供了参考。

八、参考资料文献

  1. OpenCV 官方文档
  2. JavaCV 官方文档
  3. 数字图像处理(第三版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908275.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ unordered封装

C 哈希-CSDN博客 哈希表是unordered系列容器的底层逻辑&#xff0c;再实现了哈希的底层后&#xff0c;我们按照如下步骤封装unordered: 1. 改变数据类型&#xff0c;将HashTable中的所有的_kv都改成T 2. 因为map需要取key&#xff0c;写一个KeyOfT的仿函数并封装 3. iterator ,…

【Nginx】前端项目开启 Gzip 压缩大幅提高页面加载速度

背景 Gzip 是一种文件压缩算法&#xff0c;减少文件大小&#xff0c;节省带宽从而提减少网络传输时间&#xff0c;网站会更快更丝滑。 // nginx roothcss-ecs-1d22:/etc/nginx# nginx -v nginx version: nginx/1.24.0// node ndde v18.20.1// dependencies "vue": …

在线教育辅助:SpringBoot试题库系统精讲

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Sprin…

【前端基础】CSS基础

目标&#xff1a;掌握 CSS 属性基本写法&#xff0c;能够使用文字相关属性美化文章页。 01-CSS初体验 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#…

操作系统进程的描述与控制知识点

前趋图和程序执行 前趋图 定义&#xff1a; 前趋图是指一个有向无循环图&#xff0c;可记为 DAG&#xff0c;它用于描述进程之间执行的先后顺序图形表示&#xff1a; 程序的执行 程序顺序执行时&#xff0c;系统资源的利用率很低 程序顺序执行时的特征 顺序性封闭性可再现性 …

【观成科技】APT组织常用开源和商业工具加密流量特征分析

概述 在当前的网络安全环境中&#xff0c;APT组织的活动愈发频繁&#xff0c;利用其高级技术和社会工程手段&#xff0c;针对全球范围内的政府、军事和企业目标发起了一系列复杂的网络攻击。在不断升级的攻击中&#xff0c;开源和商业工具凭借其灵活性、易用性和全球化攻击能力…

自杀一句话木马(访问后自动删除)

在做安全测试时&#xff0c;例如文件上传时就要上传可以解析的脚本文件解析证明存在漏洞&#xff0c;这个时候就需要(访问后自动删除文件的一句话木马) PHP <?php echo md5(1);unlink(__FILE__); ?> 访问后自动删除

在Microsoft Outlook日历中添加多个时区

在Microsoft Outlook日历中添加多个时区 1.单击Outlook中的文件选项卡&#xff0c;单击选项 2.左侧菜单中选择日历 3.向下滚动到时区部分&#xff0c;并标记当前时区&#xff0c;比如China 4.选中“显示第二个时区”框 5.选择第二个时区并给它一个标签&#xff0c;比如Germa…

python常用的第三方库下载方法

方法一&#xff1a;打开pycharm-打开项目-点击左侧图标查看已下载的第三方库-没有下载搜索后点击install即可直接安装--安装成功后会显示在installed列表 方法二&#xff1a;打开dos窗口输入命令“pip install requests“后按回车键&#xff0c;看到successfully既安装成功&…

Rust 力扣 - 238. 除自身以外数组的乘积

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题主要有个关键点&#xff0c;就是元素能取0&#xff0c;然后我们分类讨论元素为0的数量 如果数组中存在至少两个元素为0&#xff0c;则每个元素的除自身以外的乘积为0如果数组中仅存在一个0&#xff0c;则为…

二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

文章目录 零、前言一、应用层协议原理1.1 网络应用的体系结构1.1.1 客户-服务器(C/S)体系结构1.1.2 对等体&#xff08;P2P&#xff09;体系结构1.1.3 C/S 和 P2P体系结构的混合体 1.2 进程通信1.2.1 问题1&#xff1a;对进程进行编址&#xff08;addressing&#xff09;&#…

【计算机网络篇】数据链路层(14)虚拟局域网VLAN(概述,实现机制)

文章目录 &#x1f6f8;虚拟局域网VLAN&#x1f354;虚拟局域网VLAN的实现机制&#x1f95a;IEEE 802.1Q帧&#x1f95a;以太网交换机的接口类型&#x1f5d2;️例一&#xff1a;在一个交换机上不进行人为的VLAN划分&#xff0c;交换机各接口默认属于VLAN1且类型为Access的情况…

【无人机设计与控制】红嘴蓝鹊优化器RBMO求解无人机路径规划MATLAB

摘要 无人机在复杂环境中的路径规划是一个非线性、非凸优化问题&#xff0c;具有高维度和多约束性。本文提出了基于红嘴蓝鹊优化器&#xff08;RBMO&#xff09;的方法&#xff0c;用于求解无人机路径规划问题。RBMO算法借鉴了红嘴蓝鹊的觅食和群体行为&#xff0c;以全局搜索…

跨平台OFD、PDF文档预览UTS插件

〇、介绍 Seal-OfdReader是跨平台OFD文档预览原生插件&#xff0c;具有以下特点&#xff1a; 支持UniApp项目集成&#xff0c;也支持原生Android项目集成 非腾讯X5&#xff0c;无内核加载&#xff0c;高效率、稳定高可用 支持在线文档&#xff0c;也支持离线设备本地文档 支…

电机学习-SPWM原理及其MATLAB模型

SPWM原理及其MATLAB模型 一、SPWM原理二、基于零序分量注入的SPWM三、MATLAB模型 一、SPWM原理 SPWM其实是相电压的控制方式&#xff0c;定义三相正弦相电压的表达式&#xff1a; { V a m V m sin ⁡ ω t V b m V m sin ⁡ ( ω t − 2 3 π ) V c m V m sin ⁡ ( ω t 2…

CasaOS香橙派安装HomeAssistant智能家居系统并实现远程管理家中智能设备

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

哈希表,哈希桶及配套习题

我们今天带大家简单了解哈希表是怎样的&#xff0c;和简单模拟哈希桶&#xff0c;还有几道练习题 一&#xff0c;哈希表 什么是哈希表&#xff0c;哈希表是一种非常非常高效的数据结构&#xff0c;它用来搜索我们想要的数据&#xff0c;我们之前学过很多查找方法&#xff0c;最…

R语言贝叶斯分层、层次(Hierarchical Bayesian)模型房价数据空间分析

原文链接&#xff1a;https://tecdat.cn/?p38077 本文主要探讨了贝叶斯分层模型在分析区域数据方面的应用&#xff0c;以房价数据为例&#xff0c;详细阐述了如何帮助客户利用R进行模型拟合、分析及结果解读&#xff0c;展示了该方法在处理空间相关数据时的灵活性和有效性。&a…

拉取git代码不适用ssh,使用用户名及密码

最近换了新电脑&#xff0c;拉取git代码&#xff0c;提示我需要配置ssh&#xff0c;但是着实是有点麻烦了&#xff0c;所以使用用户名和密码的方式可以直接拉取 首先登陆git后找到对应项目地址&#xff0c;有ssh 和http。但是这两种都不是我们要用的地址&#xff0c;使用用户名…

第三十一章 Vue之路由(VueRouter)

目录 一、引言 1.1. 路由介绍 二、VueRouter 三、VueRouter的使用 3.1. 使用步骤&#xff08;52&#xff09; 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Friend.vue 3.2.4. My.vue 3.2.5. Find.vue 一、引言 1.1. 路由介绍 Vue中路由就是路径和组件的映…