(十二)图像的Sobel梯度锐化

环境:Windows10专业版 + IDEA2021.2.3 + jdk11.0.1 + OpenCV-460.jar

系列文章:

(一)Python+GDAL实现BSQ,BIP,BIL格式的相互转换

(二)BSQ,BIL,BIP存储格式的相互转换算法

(三)单波段图像的伪彩色合成:密度分割(含介绍OpenCV中的Mat类)

(四)图像的%2线性拉伸

(五)图像的标准假彩色合成

(六)图像的直方图均衡化

(七)图像的均值滤波

(八)图像的中值滤波

(九)图像的高斯低通滤波

(十)图像的梯度倒数加权平滑

(十一)图像的罗伯特梯度锐化

(十二)图像的Sobel梯度锐化

(十三)图像的拉普拉斯梯度锐化

目录

一、Sobel梯度锐化简介

二、算法流程

三、代码实现

四、实验结果

1、读入的图像

2、经过Sobel梯度处理后的图像


一、Sobel梯度锐化简介

Sobel梯度锐化是一种基于Sobel算子的图像处理方法,用于增强图像的边缘和细节

Sobel算子是一种用于边缘检测的算法,它通过计算图像中每个像素点的梯度强度和方向来突出显示图像的边缘。Sobel算子包括两个3x3的矩阵,分别用于水平和垂直方向的边缘检测。这两个矩阵与图像进行卷积运算,从而得到水平和垂直方向的梯度近似值。Sobel算子的特点是它认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对当前像素的影响越大,这样的加权方式使得Sobel算子在进行边缘检测时能够更好地突出边缘轮廓。

在图像处理中,Sobel算子的应用主要包括以下关键点:

1、边缘检测:Sobel算子可以有效地检测出图像中的边缘,这对于图像分析和理解至关重要。边缘通常代表了图像中的重要结构信息,如物体的轮廓等。

2、图像锐化:通过强调图像的边缘,Sobel算子可以使图像看起来更清晰,细节更加突出。这在图像锐化处理中非常有用,尤其是在需要增强图像细节的情况下。

3、噪声抑制:虽然Sobel算子主要用于边缘检测,但它也可以帮助减少图像中的随机噪声,因为它主要关注于图像中的结构性变化,而不是随机的小幅度变化。

4、优缺点:对边缘的检测更加精确;但不适用于含有大量噪声的图像。

Sobel梯度锐化是图像处理中的一个基本而重要的技术,它在边缘检测、图像锐化和噪声抑制等方面有着广泛的应用。

二、算法流程

(以单波段灰度图像为例)

1、利用OpenCV读入图像,将像素存储在数组里

2、h1突出水平方向上的特征,h2突出垂直方向上的特征,用水平方向上的模板h1计算后取绝对值再加上垂直方向上的模板h2计算后取绝对值

3、将经过Sobel梯度处理后的像素值存入数组合成图像并存储

三、代码实现

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;/*** @Author: HNUST_jue_chen* @Date: 2022/11/04/ 22:04* @Attention: 转载, 引用请注明出处*/public class SobelGradient {//加载本地动态链接库static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}//Sobel梯度锐化public Mat sobelSharping(String path) {//使用Mat类存储图像信息Mat mat = Imgcodecs.imread(path);//图像的大小int rows = mat.rows();int cols = mat.cols();//获得原图像像素数组int[][] mat_arr = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {mat_arr[i][j] = (int) mat.get(i, j)[0];}}//用Sobel算子进行锐化int[][] mat_arr_sobelSharp = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {//处理非边缘的像素if (i != 0 && i != rows - 1 && j != 0 && j != cols - 1) {mat_arr_sobelSharp[i][j] = Math.abs((mat_arr[i - 1][j - 1] * (-1)) + mat_arr[i - 1][j] * (-2)+ mat_arr[i - 1][j + 1] * (-1) + (mat_arr[i + 1][j - 1])+ mat_arr[i + 1][j] * (2) + mat_arr[i + 1][j + 1])+ Math.abs((mat_arr[i - 1][j - 1] * (-1)) + mat_arr[i][j - 1] * (-2)+ mat_arr[i + 1][j - 1] * (-1) + (mat_arr[i - 1][j + 1])+ mat_arr[i][j + 1] * (2) + mat_arr[i + 1][j + 1]);} else {    //处理边缘的像素mat_arr_sobelSharp[i][j] = mat_arr[i][j];}}}//合成图像Mat mat_sobelSharp = new Mat(rows, cols, CvType.CV_32SC1);//将像素放入图像for (int i = 0; i < rows; i++) {//一次放入一行像素值mat_sobelSharp.put(i, 0, mat_arr_sobelSharp[i]);}return mat_sobelSharp;}public static void main(String[] args) {SobelGradient sg = new SobelGradient();Mat mat = sg.sobelSharping("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray.png");//将经过Sobel锐化后的图像写入文件Imgcodecs.imwrite("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray_sg.png", mat);}
}

四、实验结果

1、读入的图像

2、经过Sobel梯度处理后的图像

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Spring的缓存抽象来集成不同的缓存提供者,如Ehcache、Redis等

使用Spring的缓存抽象来集成不同的缓存提供者&#xff0c;如Ehcache、Redis等 使用Spring的缓存抽象来集成不同的缓存提供者&#xff0c;如Ehcache、Redis等是非常常见的做法。Spring提供了Cacheable、CachePut、CacheEvict等注解&#xff0c;可以轻松地在Spring应用程序中使用…

Python类的基本结构

当我们在Python中定义类时&#xff0c;我们实际上是在创建一种新的数据类型。类允许我们定义对象的属性和方法&#xff0c;从而构建更复杂的程序。让我们深入探讨一下关于类的一些重要概念。 定义类&#xff1a;基本结构 一个类的基本结构包括以下部分&#xff1a; 类名&…

图论- 最小生成树

一、最小生成树-prim算法 1.1 最小生成树概念 一幅图可以有很多不同的生成树&#xff0c;比如下面这幅图&#xff0c;红色的边就组成了两棵不同的生成树&#xff1a; 对于加权图&#xff0c;每条边都有权重&#xff08;用最小生成树算法的现实场景中&#xff0c;图的边权重…

UI的设计

一、RGB888的显示 即红色&#xff0c;绿色&#xff0c;蓝色都为8位&#xff0c;即通常说的24位色。可以很好显示各种过渡颜色。从硬件上&#xff0c;R、G、B三基色的连接线各需要有8根&#xff0c;即24根数据线&#xff1b;软件上存储的数据量也需要24位&#xff0c;即3个字节&…

元素选择器csp

1.解题思路 注意标签是不分大小写而id分大小写且每行只含一个元素&#xff0c;所以对于每一行提取出其标签&#xff08;统一转换为小写&#xff09;、id(如果有)和通过点的个数计算层级&#xff0c;对于每一组查询输入&#xff0c;找到最后一层的元素&#xff0c;遍历每一行&a…

主干网络篇 | YOLOv8更换主干网络之EfficientNet

前言:Hello大家好,我是小哥谈。EfficientNet是一种高效的卷积神经网络架构,由Mingxing Tan和Quoc V. Le在2019年提出,其设计思想是在不增加计算复杂度的情况下提高模型的准确性。它引入了一个称为"复合系数"的概念,该系数用于同时缩放网络的深度、宽度和分辨率。…

RabbitMQ 延时消息实现

1. 实现方式 1. 设置队列过期时间&#xff1a;延迟队列消息过期 死信队列&#xff0c;所有消息过期时间一致 2. 设置消息的过期时间&#xff1a;此种方式下有缺陷&#xff0c;MQ只会判断队列第一条消息是否过期&#xff0c;会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…

光伏发电量预测(Python代码,CNN结合LSTM,TensorFlow框架)

1.数据集&#xff08;开始位置&#xff09;&#xff0c;数据集免费下载链接&#xff1a;https://download.csdn.net/download/qq_40840797/89051099 数据集一共8列&#xff0c;第一列是时间&#xff0c;特征列一共有6列&#xff1a;"WindSpeed" - 风速 "Sunshi…

C++template之类模版进一步了解

前言&#xff1a;这一篇是在我的上一篇文章的基础上&#xff0c;再进一步所写的。 链接&#xff1a;CTemplate&#xff1c;&#xff1e;模版的介绍及深度解析-CSDN博客 一、类模板实例化 1.非类型模版参数 类型模版参数&#xff1a;就是跟在 class后面或者typename后的类型 非…

visual studio报:引发的异常:“System.DllNotFoundException”(位于 ConsoleCAN1.exe 中)

最近在重构CAN通信的代码&#xff0c;把论文中的java转为C#实现&#xff0c;由于某种原因&#xff0c;java不能复现&#xff0c;所以转为c#。 然而c#的重构过程遇到许多问题&#xff0c;因为两种语言的编程方式、线程等等实现上有所差异。 其中一个错误&#xff1a; 引发的异…

vue3+threejs新手从零开发卡牌游戏(二十一):添加战斗与生命值关联逻辑

首先将双方玩家的HP存入store中&#xff0c;stores/common.ts代码如下&#xff1a; import { ref, computed } from vue import { defineStore } from piniaexport const useCommonStore defineStore(common, () > {const _font ref() // 字体const p1HP ref(4000) // 己…

三菱Q系列PLC以太网TCP通讯FB块源码

三菱Q系列PLC的tcp通讯&#xff0c;客户端和服务器两个变量好用的FB块&#xff0c;调用块就可以实现通讯连接&#xff0c;不需要自己写程序&#xff0c;简单配置引脚就可以。该块还集成了断网&#xff0c;连接错误&#xff0c;发送接收数据错误报警等功能。具体功能见下面介绍.…

Redis的数据类型List使用场景实战

Redis的数据类型List使用场景实战 场景题&#xff1a;面试官问redis的List数据结构在你们项目是怎么用的&#xff0c;你说没有用过&#xff0c;这哪行&#xff0c;说你能想到啥场景不&#xff0c;面试的你不知所措。。。 进入正题&#xff1a; 知识回顾 // 从左边推送数据 r…

Odoo限制线上路径访问

在Odoo中&#xff0c;有时需要限制对某些路径的访问&#xff0c;以保护敏感数据或维护系统的安全性。这可以通过自定义权限规则和修改控制器方法来实现。本教程将详细介绍如何在Odoo中限制线上路径的访问&#xff0c;包括创建自定义权限规则和修改控制器方法&#xff0c;并通过…

MongoDB聚合运算符:$let

文章目录 MongoDB聚合运算符&#xff1a;$let语法使用举例 MongoDB聚合运算符&#xff1a;$let $let聚合运算符绑定用于表示计算的变量&#xff0c;并返回表达式的结果。 语法 {$let:{vars: { <var1>: <expression>, ... },in: <expression>} }vars 用于在…

sql Tuning Advisor启用导致业务性能问题

数据库每天晚上10点后业务性能很卡&#xff0c;大量的insert被堵塞&#xff0c;查询等待事件发现有大量的“library cache lock”和“cursor: pin S wait on X”。 22:00数据库的统计信息开始收集&#xff0c; Sql Tuning Advisor堵塞了统计信息的收集&#xff0c;等待事件是“…

opencv-python库 cv2.imwrite() 保存图片

cv2.imwrite 是 OpenCV 库中的一个函数&#xff0c;用于将图像数据保存为文件。其基本语法如下&#xff1a; python cv2.imwrite(filename, img, [params]) 参数说明&#xff1a; filename&#xff1a;要保存的图像的文件名&#xff0c;包括文件路径和扩展名&#xff08;如 …

利用HIVE的窗口函数进行SQL查询中出现的问题记录

student_info部分数据 score_info部分数据 course_info 1、问题复现 --完整SQL selectsti.stu_id,sti.stu_name,concat_ws(",",collect_set(ci.course_name)) over(partition by sti.stu_id) fromstudent_info sti left joinscore_info sci onsti.stu_idsci.stu_id l…

每天学习一个Linux命令之awk

每天学习一个Linux命令之awk 介绍 在Linux系统中&#xff0c;有很多强大的命令可以帮助我们处理文本数据。其中一个非常常用且强大的命令就是awk。awk是一种编程语言&#xff0c;也是一种处理文本数据的工具。 awk通过在输入文本中匹配指定模式&#xff0c;并对匹配到的行执…

mysql之MyBatis核心工作原理

MyBatis核心工作原理 一、源码环境 1.手动编译源码 工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释&#xff0c;我们可以自己来从官网下载源码编译生成对应的Jar包&#xff0c;然后上传到本地maven仓库&#xff0c;再引用这个Jar。大家可以自行去官…