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

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

系列文章:

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

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

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

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

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

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

(七)图像的均值滤波

(八)图像的中值滤波

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

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

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

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

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

目录

一、梯度倒数加权简介

二、算法流程

三、代码实现

四、实验结果

1、读入的图像

2、经过梯度倒数加权平滑后的图像


一、梯度倒数加权简介

图像的梯度倒数加权平滑是一种基于像素邻域梯度信息的数字图像处理技术,主要用于降低图像噪声同时保留边缘特征

以下是关于图像梯度倒数加权平滑的具体介绍:

1、基本原理:在一幅图像中,相邻区域之间的变化通常大于区域内部的变化。在同一区域内,中心像素的变化小于边缘像素的变化。图像梯度反映了这种变化率,即在图像变化缓慢的区域梯度值较小,而在变化快的区域梯度值较大。梯度倒数加权平滑正是利用这个原理,对图像中的像素进行加权平均,使得变化平缓区域的像素获得较大的平滑效果,而变化剧烈的边缘区域则保持原有特征。

2、应用范围:由于其在去噪的同时能够有效保留图像边缘,梯度倒数加权平滑广泛应用于图像预处理、医学成像、遥感图像分析等领域。

3、注意事项:在进行梯度倒数加权平滑时,应注意选择适当的窗口大小和权重函数,以达到最佳的去噪效果和边缘保持能力。

4、与其他方法对比:与直方图修正法等其他图像增强技术相比,梯度倒数加权平滑更注重于局部特征的保持,而不是全局的对比度调整。

5、数学基础:从数学角度来看,图像可以被视为一个二维离散函数。图像梯度是一个矢量,表示函数在某点沿着该方向变化最快,变化率为梯度的模。在数字图像处理中,通常通过计算像素点的偏微分来估计图像梯度。

图像的梯度倒数加权平滑是一种有效的图像去噪技术,它通过对图像局部区域进行加权平均来降低噪声,同时保留重要的边缘信息。

二、算法流程

(以单波段图像为例) 

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

2、边缘像素不做处理,以3×3模板为例,模板为

 规定w( i ,j ) = 1/2,其余系数之和为1/2,定义除中心像素外的其他系数为

 对于中心像素与其他像素的差值为0的情况,用如下公式:

 通过下面公式将w总和归一化为1/2:

 3、进行卷积运算:

新像素=0.022×21+0.218×30+0.073×28+0.031×24+0.5×31+0.027×23+0.044×36+0.031×38+0.054×27≈30

 4、将经过梯度倒数加权平滑后的像素值存入数组合成图像并存储

三、代码实现

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/02/ 19:40* @Attention: 转载, 引用请注明出处*/public class GradientReciprocalWeighting {//加载本地动态链接库static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}//梯度倒数加权public Mat gradientReciprocalWeightingFilter(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];}}//用3×3窗口进行梯度倒数加权平滑int[][] mat_arr_gradientReciWeight = 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) {//3×3窗口的原始图像梯度倒数double[][] temp = new double[3][3];temp[0][0] = judgment(mat_arr[i - 1][j - 1] , mat_arr[i][j]);temp[0][1] = judgment(mat_arr[i - 1][j] , mat_arr[i][j]);temp[0][2] = judgment(mat_arr[i - 1][j + 1] , mat_arr[i][j]);temp[1][0] = judgment(mat_arr[i][j - 1] , mat_arr[i][j]);temp[1][1] = 0;temp[1][2] = judgment(mat_arr[i][j + 1] , mat_arr[i][j]);temp[2][0] = judgment(mat_arr[i + 1][j - 1] , mat_arr[i][j]);temp[2][1] = judgment(mat_arr[i + 1][j] , mat_arr[i][j]);temp[2][2] = judgment(mat_arr[i + 1][j + 1] , mat_arr[i][j]);//得到梯度倒数之和double temp_sum = 0.0;for (double[] m : temp) {for (double n : m) {temp_sum += n;}}//归一化后的梯度权重矩阵double[][] temp_normalize = new double[3][3];for (int p = 0; p < temp_normalize.length; p++) {for (int q = 0; q < temp_normalize[0].length; q++) {if (p == 1 && q == 1) {temp_normalize[p][q] = 0.5;} else {temp_normalize[p][q] = temp[p][q] / (2 * temp_sum);}}}//得到新中心像素mat_arr_gradientReciWeight[i][j] = (int) (temp_normalize[0][0] * mat_arr[i - 1][j - 1]+ temp_normalize[0][1] * mat_arr[i - 1][j]+ temp_normalize[0][2] * mat_arr[i - 1][j + 1]+ temp_normalize[1][0] * mat_arr[i][j - 1]+ temp_normalize[1][1] * mat_arr[i][j]+ temp_normalize[1][2] * mat_arr[i][j + 1]+ temp_normalize[2][0] * mat_arr[i + 1][j - 1]+ temp_normalize[2][1] * mat_arr[i + 1][j]+ temp_normalize[2][2] * mat_arr[i + 1][j + 1]);} else {    //处理边缘像素mat_arr_gradientReciWeight[i][j] = mat_arr[i][j];}}}//合成图像Mat mat_gradientReciWeight = new Mat(rows, cols, CvType.CV_32SC1);//将像素放入图像for (int i = 0; i < rows; i++) {//一次放入一行像素值mat_gradientReciWeight.put(i, 0, mat_arr_gradientReciWeight[i]);}return mat_gradientReciWeight;}//进行判断中心像素与边缘像素的差值是否为0public static double judgment(int a, int b) {double c;if (a - b == 0) {c = 1.0;} else {c = 1.0 / (Math.abs(a - b));}return c;}public static void main(String[] args) {GradientReciprocalWeighting grw = new GradientReciprocalWeighting();Mat mat = grw.gradientReciprocalWeightingFilter("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray1.png");//将经过梯度倒数加权平滑后的图像写入文件Imgcodecs.imwrite("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\2_gray1_grw.png", mat);}
}

四、实验结果

1、读入的图像

2、经过梯度倒数加权平滑后的图像

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

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

相关文章

Machine Learning机器学习之统计分析

目录 前言 机器学习之统计分析 统计学的主要目标包括&#xff1a; 统计学核心概念&#xff1a; 统计基础&#xff1a; 训练误差&#xff1a; 常见的损失函数&#xff1a; 正则化和交叉验证 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉…

每日一题 --- 快乐数[力扣][Go]

快乐数 题目&#xff1a;202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

java电话号码的字母组合(力扣Leetcode17)

电话号码的字母组合 力扣原题链接 问题描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 示例 1&#xff1a;…

Redis开源协议变更!Garnet:微软开源代替方案?

Garnet&#xff1a;微软开源的高性能替代方案&#xff0c;秉承兼容 RESP 协议的同时&#xff0c;以卓越性能和无缝迁移能力重新定义分布式缓存存储&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 最近&#xff0c;Redis修改了开源协议&#xff0c;从BSD变成了 SSPLv…

虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)

最好先安装anaconda后cuda和cudnn&#xff0c;因为配置环境的时候可能conda会覆盖cuda的路径&#xff08;不确定这种说法对不对&#xff0c;这里只是给大家的建议&#xff09; 准备工作&#xff1a; 1.Ubuntu18.04&#xff0c;x86_64&#xff0c;amd64 虚拟机下载和虚拟机Ubu…

|行业洞察·趋势报告|《2024旅游度假市场简析报告-17页》

报告的主要内容解读&#xff1a; 居民收入提高推动旅游业发展&#xff1a;报告指出&#xff0c;随着人均GDP的提升&#xff0c;居民的消费能力增强&#xff0c;旅游需求从传统的观光游向休闲、度假游转变&#xff0c;国内人均旅游消费持续增加。 政府政策促进旅游市场复苏&…

SlerfTools:简化操作,激发Solana生态创新潜能

在区块链世界的快速演变中,Solana生态系统以其独特的高性能吸引了全球的目光。然而,随着生态系统的蓬勃发展,用户和开发者面临的挑战也日渐增多。正是在这样的背景下,一个名为SlerfTools的新星项目应运而生,它承诺将为Solana带来一场革命性的变革。 项目的诞生 SlerfTools并非…

计算机网络——30SDN控制平面

SDN控制平面 SDN架构 数据平面交换机 快速、简单&#xff0c;商业化交换设备采用硬件实现通用转发功能流表被控制器计算和安装基于南向API&#xff0c;SDN控制器访问基于流的交换机 定义了哪些可以被控制哪些不能 也定义了和控制器的协议 SDN控制器&#xff08;网络OS&#…

CDH集群hive初始化元数据库失败

oracle数据库操作&#xff1a; 报错如下&#xff1a;命令 (Validate Hive Metastore schema (237)) 已失败 截图如下&#xff1a; 后台日志部分摘录&#xff1a; WARNING: Use “yarn jar” to launch YARN applications. SLF4J: Class path contains multiple SLF4J binding…

PHP开发全新29网课交单平台源码修复全开源版本,支持聚合登陆易支付

这是一套最新版本的PHP开发的网课交单平台源代码&#xff0c;已进行全开源修复&#xff0c;支持聚合登录和易支付功能。 项目 地 址 &#xff1a; runruncode.com/php/19721.html 以下是对该套代码的主要更新和修复&#xff1a; 1. 移除了论文编辑功能。 2. 移除了强国接码…

定时器的原理和应用

#include<reg51.h> unsigned char s[]{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char count0,num0; void inittimer() {TMOD0x01;//0000 0001TH0(65536-50000)/256; //定时50ms50000us 2562^8 初值向右边移动8位TL0(65536-50000)%256;ET01;//开启定…

星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)

之前写了个1.0版本&#xff0c;由于太局限&#xff0c;需要用到笔记本才能操作&#xff0c;很多车友反馈不方便。特此出个手机版教程&#xff0c;简单easy&#xff0c;妈妈再也不用担心我搞不定啦 一、准备工作 先卸载车机上的autokit 或者 智能互联 app&#xff0c;这步很关…

Avue-crud表格操作栏不显示修改、删除按钮

2024-03-28 奇了怪了&#xff0c;CSDN自动把我之前的文章设置为VIP了&#xff0c;怪不得有时候搜东西看着看着要收费&#xff0c;现在找东西都不好找&#xff0c;我已经反馈不同意了&#xff0c;看看能不能给我取消吧 今天用Avue的时候发现操作栏的按钮没了&#xff0c;按照文…

win10+cuda11.8+cudnn8.6.0安装

目录 一、NVIDIA 驱动程序下载 二、cuda11.8下载 三、cudnn8.6.0下载 四、确认cuda和cudnn是否安装成功 一、NVIDIA 驱动程序下载 1、查看显卡类型&#xff1a;连续按下CTRLALTDELETE -> 选择任务管理器 -> 性能 -> GPU -> 右上角 2、下载地址&#xff1a;官方…

生成式 AI 学习资源大汇总

这里汇聚了该领域的海量学习资源&#xff0c;从研究更新到面试技巧&#xff0c;从课程材料到免费课程&#xff0c;还有实用代码&#xff0c;一应俱全&#xff0c;是你工作流程中的得力助手&#xff01; 前沿研究&#xff1a;每月精心筛选的最佳生成式 AI 论文列表&#xff0c;让…

pandas数据保存与加载

安装操作Excel模拟数据写入编辑读取切片操作 统计 安装 pip install pandas pip install numpyExcel环境安装 pip install xlrd pip install xlwt pip install openpyxi操作Excel import pandas as pd 模拟数据 写入 import pandas as pd# 模拟需要写入的数据 dic{name:[…

Pytorch的hook函数

hook函数是勾子函数&#xff0c;用于在不改变原始模型结构的情况下&#xff0c;注入一些新的代码用于调试和检验模型&#xff0c;常见的用法有保留非叶子结点的梯度数据&#xff08;Pytorch的非叶子节点的梯度数据在计算完毕之后就会被删除&#xff0c;访问的时候会显示为None&…

JAVAEE——线程池

文章目录 线程池的概念什么是线程池&#xff1f; 标准库中的线程池线程池的创建工厂模式工厂模式的用途线程池涉及到的类有哪些Executor接口ExecutorService接口Executors工厂类AbstractExecutorService虚类ThreadPoolExecutor普通类ThreadPoolExecutor内部的实现4个拒绝策略 线…

(C++) 属性说明符-语法

文章目录 前言语法&#x1f3f7;️非标准语法⭐GCC⭐MSVC &#x1f3f7;️[[ 属性列表 ]] (C11 起)⭐标识符⭐属性命名空间::标识符⭐标识符(实参列表 &#xfeff;(可选) )⭐同时多个属性 &#x1f3f7;️[[ using 属性命名空间 : 属性列表 ]] (C17 起)&#x1f3f7;️解释⭐…

图解Dijkstra和Bellman-Ford的流程以及证明

说到寻路&#xff0c;在游戏里面应用最多的自然还是A寻路&#xff0c;但是这篇文章不讨论A寻路&#xff0c;主要是介绍Dijkstra和Bellman-Ford&#xff0c;因为这两个寻路核心代码少&#xff0c;但是正确性却不容易直接看出来&#xff0c;网上的博客也基本都是画步骤告诉大家怎…