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

2024-03-29 09:36

本文主要是介绍(十)图像的梯度倒数加权平滑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境: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://www.chinasem.cn/article/858250

相关文章

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许多领域逐渐暴露出其不足之处。带动量的随机梯度下降法(Momentum SGD)应运而生,并被广泛应用于各类深度学习模型中。 在本篇文章中,我们将深入探讨带动量的随