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. 数字图像处理(第三版)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

二百七十四、Kettle——ClickHouse中对错误数据表中进行数据修复(实时)

一、目的 在完成数据清洗、错误数据之后&#xff0c;需要根据修复规则对错误数据进行修复 二、Hive中原有代码 insert into table hurys_db.dwd_queue partition(day) selecta3.id,a3.device_no,a3.source_device_type,a3.sn,a3.model,a3.create_time,a3.lane_no,a3.lane_…

第2章 Android App开发基础

第 2 章 Android App开发基础 bilibili学习地址 github代码地址 本章介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一 样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计…

ARM base instruction -- csetm

Conditional Set Mask sets all bits of the destination register to 1 if the condition is TRUE, and otherwise sets all bits to 0. 如果条件为TRUE&#xff0c;则条件设置掩码将目标寄存器的所有位设置为1&#xff0c;否则将所有位设为0。 32-bit variant Applies w…

rom定制系列------小米8青春版定制安卓14批量线刷固件 原生系统

&#x1f49d;&#x1f49d;&#x1f49d;小米8青春版。机型代码platina。官方最终版为 12.5.1安卓10的版本。客户需要安卓14的固件以便使用他们的软件。根据测试&#xff0c;原生pixeExpe固件适配兼容性较好。为方便客户批量进行刷写。修改固件为可fast批量刷写。整合底层分区…

java项目之校园资料分享平台(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园资料分享平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园资料分享平台的主要…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…

qt管理系统框架(好看界面、漂亮界面、好看的界面、漂亮的界面)

概述 最近一个项目用QT开发&#xff0c;然后找了美工帮设计了下界面。总算完工&#xff0c;后想一下干脆抽出一个基础框架&#xff0c;方便以后用。 功能 支持mysql、echarts。 支持加载动态权限菜单&#xff0c;轻松权限控制。 支持遮罩对话框、抽屉 支持开机启动动画界面 内…

力扣——相同的树(C语言)

1.题目&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 2.原理&#xff1a; 这里直接将两个数的结点进行比较&#xff0c;向下递归&…

2024年双11买什么东西划算?2024年双十一必买清单好物大总结

双十一购物节&#xff0c;海量商品与诱人折扣并存&#xff0c;正是我们精打细算、理性消费的好时机。面对琳琅满目的爆款与折扣&#xff0c;记得先问问自己&#xff1a;这真的是我需要的吗&#xff1f;在日常中能否发挥其价值&#xff1f;基于这样的考量&#xff0c;我们精选了…

机器学习入门指南:从基础到实践

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 机器学习入门指南&#xff1a;从基础到实践 机器学习入门指南&#xff1a;从基础到实践 机器学习入门指南&#xff1a;从基础到实…

通义灵码实操—飞机大战游戏

通义灵码实操—飞机大战游戏 有没有想象过自己独立编写一个有趣的小游戏。在本实践课程中&#xff0c;你不仅可以实现这个想法&#xff0c;而且还将得到通义灵码智能编程助手的支持与指导。我们将携手步入编程的神奇世界&#xff0c;以一种简洁、高效且具有创造性的方式&#…

react-router与react-router-dom的区别

写法上的区别&#xff1a; 写法1: import {Swtich, Route, Router, HashHistory, Link} from react-router-dom;写法2: import {Switch, Route, Router} from react-router; import {HashHistory, Link} from react-router-dom;react-router实现了路由的核心功能 react-router-…

react使用Fullcalendar 实战用法

使用步骤请参考&#xff1a;react使用Fullcalendar 卡片式的日历&#xff1a; 需求图&#xff1a; 卡片式的日历&#xff0c;其实我是推荐 antd的&#xff0c;我两个都写了一下都能实现。 antd 的代码&#xff1a; antd的我直接用的官网示例&#xff1a;antd 日历示例 i…

mysql中redolog、binlog

我们中说删库跑路&#xff0c;那么数据库删除后&#xff0c;里面的数据怎么恢复呢&#xff1f; 这里就涉及到了redolog和binlog了 一、什么是存储引擎和缓冲池 存储引擎是 MySQL 中直接与磁盘交互部分。也是存储引擎读写数据的最小单位&#xff0c;一个页里可以有一条或多条…

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…

openGauss开源数据库实战十四

文章目录 任务十四 openGauss 逻辑结构:视图管理任务目标实施步骤一、准备工作二、为什么需要视图1.通过视图对用户隐藏信息2.创建一个比逻辑模型更符合用户直觉的表 三、创建视图时指定视图的属性名四、基于视图建立新的视图五、物化视图六、视图失效(openGauss暂不支持)七、通…

DICOM标准:US超声模块属性详解——超声医学的DICOM标准解析

引言 数字成像和通信在医学领域中的应用极为广泛&#xff0c;其中DICOM&#xff08;数字成像和通信医学&#xff09;标准对于确保不同设备和系统之间的兼容性和互操作性至关重要。本文将详细介绍DICOM标准中关于超声医学&#xff08;Ultrasound, US&#xff09;的部分&#xff…

分布式光伏管理办法

随着分布式光伏项目的不断增加&#xff0c;传统的管理方式已经难以满足高效、精准的管理需求。光伏业务管理系统作为一种集信息化、智能化于一体的管理工具&#xff0c;正在逐步成为分布式光伏项目管理的重要支撑。 光伏业务管理系统通过数字化手段实现对光伏业务全流程的精细化…

录屏+直播神器 OBS Studio 30.2.3

这款很多游戏博主都在用的录制神器&#xff0c;平时你看到的抖音平台上的游戏主播&#xff0c;大部分都用的这款直播录屏软件。同时它可以虚拟直播&#xff08;绿幕虚拟背景&#xff09;具体可以百度或哔哩哔哩上有详细教程 软件优点 高性能实时视频/音频捕获和混合。创建由多个…

企业应该采用和支持网络安全的几个实践

令人惊讶的是&#xff0c;网络安全可以像遵循最佳实践一样简单&#xff0c;理想情况下应该将其融入企业文化本身。在这篇文章中了解更多。 网络安全的重要性 在当今的网络安全期望中&#xff0c;软件工程师应该优先考虑他们的计算机系统和内部IT网络的安全性。我认为严重依赖…