当前位置: 首页 > news >正文

DIP——添加运动模糊与滤波

1.运动模糊
为了模拟图像退化的过程,在这里创建了一个用于模拟运动模糊的点扩散函数,具体模糊的方向取决于输入的motion_angle。如果运动方向接近水平,则模糊效果近似水平,如果运动方向接近垂直,则模糊效果近似垂直。具体操作如下。首先创建二维数组PSF,并将其所有元素初始化为零,作为点扩散函数的初始值。之后计算图像的中心位置。然后,计算运动方向的斜率的正切值以及余切值。根据运动方向的斜率的正切值以及余切值去判断运动方向。如果斜率的正切值小于等于1,表示运动方向接近水平,所采取的操作是在点扩散函数的相应位置设置值为1,形成一条近似水平的模糊效果。这个相应位置的计算方式是中心加上偏移量。垂直方向同理。运动模糊这一块的代码具体如下。

def motion_process(image_size, motion_angle):# 创建一个大小为image_size的二维数组PSF,并将其所有元素初始化为零,作为点扩散函数的初始值。PSF = np.zeros(image_size)print(image_size)# 计算图像的中心位置,由于数组索引是从0开始的,所以需要减1。center_position = (image_size[0] - 1) / 2print(center_position)# 计算运动方向的斜率的正切值。这里的motion_angle是以度为单位的运动方向角度。slope_tan = math.tan(motion_angle * math.pi/ 180)# 计算斜率的余切值。slope_cot = 1/slope_tan# 如果斜率的正切值小于等于1,表示运动方向接近水平。if slope_tan <=1:for i in range(15):# 计算相对于中心位置的水平偏移。round函数用于将浮点数四舍五入为整数。offset = round(i * slope_tan) #((center_position-i)*slope_tan)# 在点扩散函数的相应位置设置值为1,形成一条近似水平的模糊效果。PSF [int (center_position + offset), int(center_position - offset)] = 1# 将点扩散函数进行归一化,确保其总和为1。return PSF/PSF.sum() #对点扩散函数进行归一化亮度# 如果斜率的正切值大于1,表示运动方向接近垂直。else:for i in range(15):# 计算相对于中心位置的垂直偏移。offset = round(i * slope_cot)# :在点扩散函数的相应位置设置值为1,形成一条近似垂直的模糊效果。PSF[int(center_position - offset),int(center_position + offset)] = 1#     将点扩散函数进行归一化,确保其总和为1。return PSF / PSF.sum()

之后,对点扩散函数(PSF)进行二维傅里叶变换。这里加上e是为了避免除零错误。之后 将输入图像的傅里叶变换与点扩散函数的傅里叶变换进行逐元素相乘,在将结果进行逆傅里叶变换,得到模糊处理后的图像。最后用fftshift将频谱移到图像中心,然后取绝对值,得到最终的模糊图像。
总结一下,第一步是为了得到点扩散函数,可以理解为一个模糊的模板,这一步,是在进行时域卷积,频域乘积,对输入图像和模糊模板进行卷积,得到输出。
得到模糊图像的代码如下。

def make_blurred(input, PSF, eps):# 对输入图像进行二维傅里叶变换。input_fft = fft.fft2(input)  # 进行二维数组的傅里叶变换# 对点扩散函数(PSF)进行二维傅里叶变换,并添加一个小的常数eps以避免除零错误。这是在频域进行卷积操作的准备步骤。PSF_fft = fft.fft2(PSF) + eps# input_fft * PSF_fft, 将输入图像的傅里叶变换与点扩散函数的傅里叶变换进行逐元素相乘,这相当于在时域中进行卷积。# 之后对相乘结果进行逆傅里叶变换,得到模糊处理后的图像。blurred = fft.ifft2(input_fft * PSF_fft)# 用fftshift将频谱移到图像中心,然后取绝对值,得到最终的模糊图像。blurred = np.abs(fft.fftshift(blurred))return blurred

2.逆滤波
对图像和点扩散函数(PSF)分别进行傅里叶变换,同时将将PSF的频域表示进行平移,将其中心移到图像中心。这是为了避免逆滤波后的图像进行旋转。简单而言,就是将频域中的输入图像和PSF的傅里叶变换进行逐元素相除,然后进行逆傅里叶变换,就实现了逆滤波操作。具体代码如下。

def inverse (input, PSF, eps):input_fft = fft.fft2(input) # 进行二维数组的傅里叶变换,将图像转换到频域PSF_fft =fft.fft2(PSF)+ eps # 噪声功率,这是已知的,考虑epsilon# 为避免逆滤波后的图像进行旋转,将PSF的中心移到图像中心PSF_fft_shifted = fft.fftshift(PSF_fft)  # 将PSF的中心移到图像中心# 对频域中的输入图像和PSF的傅里叶变换进行逐元素相除,然后进行逆傅里叶变换。这一步实现了逆滤波操作。result = fft.fft2(input_fft / PSF_fft_shifted)# 对逆滤波得到的频域结果进行频谱中心平移,取其绝对值,得到逆滤波后的时域图像。result = np.abs(fft.fftshift(result))return result

3.维纳滤波
同理,对图像和点扩散函数(PSF)分别进行傅里叶变换。之后,计算维纳滤波的频域滤波器。将输入图像的傅里叶变换与维纳滤波器的傅里叶变换逐元素相乘,然后进行逆傅里叶变换,得到维纳滤波后的时域结果。具体代码如下。

def wiener(input,PSF,eps,K=0.01): # 维纳滤波,K=0.01# 对输入图像进行二维傅里叶变换,将图像转换到频域。input_fft = fft.fft2(input)# 点扩散函数(PSF)进行傅里叶变换,同时考虑了噪声功率 eps。这一步是为了在频域中进行维纳滤波操作的准备。PSF_fft = fft.fft2(PSF) + eps# 计算维纳滤波的频域滤波器。np.conj()是复共轭操作,这里计算的是维纳滤波器的分母,其中 K 是维纳滤波的参数,用于控制噪声增强的程度。PSF_fft_1 = np.conj(PSF_fft) /(np.abs(PSF_fft)** 2 + K)# 将输入图像的傅里叶变换与维纳滤波器的傅里叶变换逐元素相乘,然后进行逆傅里叶变换,得到维纳滤波后的时域结果。result = fft.ifft2(input_fft * PSF_fft_1)# 将维纳滤波后的频域结果进行频谱中心平移,取其绝对值,得到维纳滤波后的时域图像。result = np.abs(fft.fftshift(result))return result

4.函数调用与绘图
这块比较简单,直接附上代码

image = cv2.imread('R.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
img_h =image.shape[0]
img_w =image.shape[1]
plt.figure(1)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 选择一个包含中文字符的字体
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.xlabel("原始图像")
plt.gray()
plt.imshow(image) #显示原图像
plt.figure(2)
plt.gray()# 进行运动模糊处理
PSF = motion_process((img_h, img_w), 60)
blurred = np.abs(make_blurred(image, PSF, 1e-3))
plt.subplot(231)
plt.xlabel(" 进行模糊 ")
plt.imshow(blurred)
result = inverse(blurred, PSF, 1e-3)
# 逆滤波,对图像进行滤波处理
result = np.flipud(result)  
result = np.fliplr(result)
plt.subplot(232)
plt.xlabel("对进行模糊的图像进行逆滤波")
plt.imshow(result)result = wiener(blurred, PSF, 1e-3)  # 维纳滤波
plt.subplot(233)
plt.xlabel("对模糊后的图像进行维纳滤波(k=0.01)")
plt.imshow(result)# 在模糊图像上进一步添加呈正态分布的噪声
blurred_noisy = blurred + 0.1 * blurred.std()*\np.random.standard_normal(blurred.shape)  # 添加噪声,standard_normal# 产生随机的函数
plt.subplot(234)
plt.xlabel("在模糊图像上引入噪声")
plt.imshow(blurred_noisy)  # 显示添加噪声且运动模糊的图像result=inverse(blurred_noisyPSF,0.1+1e-3) # 对添加噪声的图像进行逆滤波
plt.subplot(235)
plt.xlabel("对模糊和加噪的图片进行逆滤波")
plt.imshow(result)
result = wiener(blurred_noisy, PSF,0.1 + 1e-3)  # 对添加噪声的图像进行维纳滤波
plt.subplot(236)
plt.xlabel("对模糊和加噪的图片进行维纳滤波(k=0.01) ")
plt.imshow(result)
plt.tight_layout()
plt.show()

5.运行结果
在这里插入图片描述
在这里插入图片描述
6.总结
本次实验对原来的图像进行运动模糊后,分别采用逆滤波和维纳滤波进行对图像的恢复。之后在模糊图像的基础上进一步添加呈标准正态分布的噪声。再次,分别采用逆滤波和维纳滤波进行对图像的恢复。但是从实验结果来看,还是存在一定的振铃效应。
因为开头要导入一些必要的库。完整代码如下。

import matplotlib.pyplot as plt
import numpy as np
from numpy import fft
import math
import cv2# 对退化过程进行建模
def motion_process(image_size, motion_angle):# 创建一个大小为image_size的二维数组PSF,并将其所有元素初始化为零,作为点扩散函数的初始值。PSF = np.zeros(image_size)print(image_size)# 计算图像的中心位置,由于数组索引是从0开始的,所以需要减1。center_position = (image_size[0] - 1) / 2print(center_position)# 计算运动方向的斜率的正切值。这里的motion_angle是以度为单位的运动方向角度。slope_tan = math.tan(motion_angle * math.pi/ 180)# 计算斜率的余切值。slope_cot = 1/slope_tan# 如果斜率的正切值小于等于1,表示运动方向接近水平。if slope_tan <=1:for i in range(15):# 计算相对于中心位置的水平偏移。round函数用于将浮点数四舍五入为整数。offset = round(i * slope_tan) #((center_position-i)*slope_tan)# 在点扩散函数的相应位置设置值为1,形成一条近似水平的模糊效果。PSF [int (center_position + offset), int(center_position - offset)] = 1# 将点扩散函数进行归一化,确保其总和为1。return PSF/PSF.sum() #对点扩散函数进行归一化亮度# 如果斜率的正切值大于1,表示运动方向接近垂直。else:for i in range(15):# 计算相对于中心位置的垂直偏移。offset = round(i * slope_cot)# :在点扩散函数的相应位置设置值为1,形成一条近似垂直的模糊效果。PSF[int(center_position - offset),int(center_position + offset)] = 1#     将点扩散函数进行归一化,确保其总和为1。return PSF / PSF.sum()#
def make_blurred(input, PSF, eps):# 对输入图像进行二维傅里叶变换。input_fft = fft.fft2(input)  # 进行二维数组的傅里叶变换# 对点扩散函数(PSF)进行二维傅里叶变换,并添加一个小的常数eps以避免除零错误。这是在频域进行卷积操作的准备步骤。PSF_fft = fft.fft2(PSF) + eps# input_fft * PSF_fft, 将输入图像的傅里叶变换与点扩散函数的傅里叶变换进行逐元素相乘,这相当于在时域中进行卷积。# 之后对相乘结果进行逆傅里叶变换,得到模糊处理后的图像。blurred = fft.ifft2(input_fft * PSF_fft)# 用fftshift将频谱移到图像中心,然后取绝对值,得到最终的模糊图像。blurred = np.abs(fft.fftshift(blurred))return blurred# 逆滤波的目标是尽可能地从经过模糊和添加噪声的图像中恢复原始图像
# 逆滤波
def inverse (input, PSF, eps):input_fft = fft.fft2(input) # 进行二维数组的傅里叶变换,将图像转换到频域PSF_fft =fft.fft2(PSF)+ eps # 噪声功率,这是已知的,考虑epsilon# 为避免逆滤波后的图像进行旋转,将PSF的中心移到图像中心PSF_fft_shifted = fft.fftshift(PSF_fft)  # 将PSF的中心移到图像中心# 对频域中的输入图像和PSF的傅里叶变换进行逐元素相除,然后进行逆傅里叶变换。这一步实现了逆滤波操作。result = fft.fft2(input_fft / PSF_fft_shifted)# 对逆滤波得到的频域结果进行频谱中心平移,取其绝对值,得到逆滤波后的时域图像。result = np.abs(fft.fftshift(result))return result
def wiener(input,PSF,eps,K=0.01): # 维纳滤波,K=0.01# 对输入图像进行二维傅里叶变换,将图像转换到频域。input_fft = fft.fft2(input)# 点扩散函数(PSF)进行傅里叶变换,同时考虑了噪声功率 eps。这一步是为了在频域中进行维纳滤波操作的准备。PSF_fft = fft.fft2(PSF) + eps# 计算维纳滤波的频域滤波器。np.conj()是复共轭操作,这里计算的是维纳滤波器的分母,其中 K 是维纳滤波的参数,用于控制噪声增强的程度。PSF_fft_1 = np.conj(PSF_fft) /(np.abs(PSF_fft)** 2 + K)# 将输入图像的傅里叶变换与维纳滤波器的傅里叶变换逐元素相乘,然后进行逆傅里叶变换,得到维纳滤波后的时域结果。result = fft.ifft2(input_fft * PSF_fft_1)# 将维纳滤波后的频域结果进行频谱中心平移,取其绝对值,得到维纳滤波后的时域图像。result = np.abs(fft.fftshift(result))return resultimage = cv2.imread('R.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
img_h =image.shape[0]
img_w =image.shape[1]
plt.figure(1)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 选择一个包含中文字符的字体
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.xlabel("原始图像")
plt.gray()
plt.imshow(image) #显示原图像
plt.figure(2)
plt.gray()# 进行运动模糊处理
PSF = motion_process((img_h, img_w), 60)
blurred = np.abs(make_blurred(image, PSF, 1e-3))
plt.subplot(231)
plt.xlabel(" 进行模糊 ")
plt.imshow(blurred)
result = inverse(blurred, PSF, 1e-3)
# 逆滤波,对图像进行滤波处理
result = np.flipud(result)
result = np.fliplr(result)
plt.subplot(232)
plt.xlabel("对进行模糊的图像进行逆滤波")
plt.imshow(result)result = wiener(blurred, PSF, 1e-3)  # 维纳滤波
plt.subplot(233)
plt.xlabel("对模糊后的图像进行维纳滤波(k=0.01)")
plt.imshow(result)# 在模糊图像上进一步添加呈正态分布的噪声
blurred_noisy = blurred + 0.1 * blurred.std()*\np.random.standard_normal(blurred.shape)  # 添加噪声,standard_normal# 产生随机的函数
plt.subplot(234)
plt.xlabel("在模糊图像上引入噪声")
plt.imshow(blurred_noisy)  # 显示添加噪声且运动模糊的图像result=inverse(blurred_noisyPSF,0.1+1e-3) # 对添加噪声的图像进行逆滤波
plt.subplot(235)
plt.xlabel("对模糊和加噪的图片进行逆滤波")
plt.imshow(result)
result = wiener(blurred_noisy, PSF,0.1 + 1e-3)  # 对添加噪声的图像进行维纳滤波
plt.subplot(236)
plt.xlabel("对模糊和加噪的图片进行维纳滤波(k=0.01) ")
plt.imshow(result)
plt.tight_layout()
plt.show()

相关文章:

DIP——添加运动模糊与滤波

1.运动模糊 为了模拟图像退化的过程&#xff0c;在这里创建了一个用于模拟运动模糊的点扩散函数&#xff0c;具体模糊的方向取决于输入的motion_angle。如果运动方向接近水平&#xff0c;则模糊效果近似水平&#xff0c;如果运动方向接近垂直&#xff0c;则模糊效果近似垂直。具…...

SQL Server查询计划(Query Plan)——SQL处理过程

6. 查询计划(Query Plan) 6.1. SQL处理过程 就SQL语句的处理过程而言,各关系库间大同小异,尤其是商业库之间实现机制和细节差别更小些,其功能及性能支持方面也更加强大和完善。SQL Server作为商业库中的后起之秀,作为SQL语句处理过程的主要支撑和保障,其优化器及相关机…...

【动手学深度学习】(十二)现代卷积神经网络

文章目录 一、深度卷积神经网络AlexNet1.理论知识 一、深度卷积神经网络AlexNet 1.理论知识 ImageNet(2010) 图片自然物体的彩色图片手写数字的黑色图片大小468 * 38728*28样本数1.2M60K类数100010 AlexNet AlexNet赢了2012ImageNet竞赛更深更大的LeNet主要改进&#xff…...

【小沐学Python】Python实现TTS文本转语音(speech、pyttsx3、百度AI)

文章目录 1、简介2、Windows语音2.1 简介2.2 安装2.3 代码 3、pyttsx33.1 简介3.2 安装3.3 代码 4、ggts4.1 简介4.2 安装4.3 代码 5、SAPI6、SpeechLib7、百度AI8、百度飞桨结语 1、简介 TTS(Text To Speech) 译为从文本到语音&#xff0c;TTS是人工智能AI的一个模组&#xf…...

TCP通信

第二十一章 网络通信 本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 接下来会一一讲解 TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式&#xff0c;也有着优点和缺点…...

2023济南大学acm新生赛题解

通过答题情况的难度系数&#xff1a; 签到&#xff1a;ACI 铜牌题&#xff1a;BG 银牌题&#xff1a;EF 金牌题&#xff1a;DHJKO 赛中暂未有人通过&#xff1a;LMNP A - AB Problem 直接根据公式计算就行。 #include<stdio.h> int main(){int a,b;scanf("%…...

docker-compose安装教程

1.确认docker-compose是否安装 docker-compose -v如上图所示表示未安装&#xff0c;需要安装。 如上图所示表示已经安装&#xff0c;不需要再安装&#xff0c;如果觉得版本低想升级&#xff0c;也可以继续安装。 2.离线安装 下载docker-compose安装包&#xff0c;上传到服务…...

【rabbitMQ】rabbitMQ用户,虚拟机地址(添加,修改,删除操作)

rabbitMQ的下载&#xff0c;安装和配置 https://blog.csdn.net/m0_67930426/article/details/134892759?spm1001.2014.3001.5502 rabbitMQ控制台模拟收发消息 https://blog.csdn.net/m0_67930426/article/details/134904365?spm1001.2014.3001.5502 目录 用户 添加用户…...

Python高级算法——动态规划

Python中的动态规划&#xff1a;高级算法解析 动态规划是一种解决多阶段决策问题的数学方法&#xff0c;常用于优化问题。它通过将问题分解为子问题&#xff0c;并在解决这些子问题的基础上构建全局最优解。在本文中&#xff0c;我们将深入讲解Python中的动态规划&#xff0c;…...

MySQL在Centos7环境安装

说明&#xff1a; • 安装与卸载中&#xff0c;⽤⼾全部切换成为root&#xff0c;⼀旦 安装&#xff0c;普通⽤⼾能使⽤的 1. 卸载不要的环境 [roothcss-ecs-1036 ~]# ps ajx |grep mariadb # 先检查是否有mariadb存在 13134 14844 14843 13134 pts/0 14843 S 1005 0:00 gr…...

halcon视觉缺陷检测常用的6种方法

一、缺陷检测综述 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证。首先常见缺陷:凹凸、污点瑕疵、划痕、裂缝、探伤等。常用的手法有六大金刚(在halcon中的ocv和印刷检测是针对印刷行业的检测,有对应算子封装): 1.blob+特征 2.blob+差分+特征 3.光度…...

openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup

文章目录 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup151.1 背景信息151.2 前提条件151.3 语法151.4 示例151.5 从备份文件恢复数据 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup 151.1 …...

报错:Uncaught ReferenceError: Cannot access ‘l‘ before initialization

在文件 .babelrc 或 babel.config.js &#xff0c;webpack.config.js 下配置 .babel 或 babel.config.js "plugins": ["babel/plugin-transform-runtime" ] webpack.config.js&#xff0c;详见 Webpack target module.exports {target: [web, es5], }...

计算机视觉-机器学习-人工智能顶会 会议地址

计算机视觉-机器学习-人工智能顶会 会议地址 最近应该要整理中文资料的参考文献&#xff0c;很多会议文献都需要补全会议地点&#xff08;新国标要求&#xff09;。四处百度感觉也挺麻烦的&#xff0c;而且没有比较齐全的网站可以搜索。因此自己整理了一下计算机视觉-机器学习…...

784. 字母大小写全排列

字母大小写全排列 描述 : 给定一个字符串 s &#xff0c;通过将字符串 s 中的每个字母转变大小写&#xff0c;我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。 题目 : LeetCode 784.字母大小写全排列 : 784. 字母大小写全排列 分析…...

HarmonyOS鸿蒙应用开发——HTTP网络访问与封装

文章目录 基本使用封装参考 基本使用 鸿蒙应用发起HTTP请求的基本使用&#xff0c;如下&#xff1a; 导入http模块创建httpRequest对象发起http请求&#xff0c;并处理响应结果 第一、导入http模块&#xff1a; import http from ohos.net.http第二、创建httpRequest对象&a…...

vscode 编写爬虫爬取王者荣耀壁纸

网上关于爬虫大部分教程和编辑器用的都不是vscode &#xff0c;此教程用到了vscode、Python、bs4、requests。 vscode配置Python安装环境可以看看这个大佬的教程 03-vscode安装和配置_哔哩哔哩_bilibili vscode配置爬虫环境可以参考这个大佬的教程【用Vscode实现简单的python…...

spring boot + uniapp 微信公众号 jsapi 支付

后端支付类 package com.ruoyi.coupon.payment;import com.google.gson.Gson; import com.ruoyi.coupon.payment.dto.PayParamJsapiDto; import com.ruoyi.coupon.payment.dto.RefundParam; import com.ruoyi.coupon.service.ICouponConfigService; import com.wechat.pay.jav…...

【数学建模】《实战数学建模:例题与讲解》第九讲-时间序列分析(含Matlab代码)

【数学建模】《实战数学建模&#xff1a;例题与讲解》第九讲-时间序列分析&#xff08;含Matlab代码&#xff09; 基本概念确定性时间序列分析方法平稳时间序列模型ARIMA模型季节性序列 习题8.11. 题目要求2.解题过程3.程序4.结果 习题8.21. 题目要求2.解题过程3.程序4.结果 习…...

大话数据结构-查找-有序表查找

注&#xff1a;本文同步发布于稀土掘金。 3 有序表查找 3.1 折半查找 折半查找&#xff08;Binary Search&#xff09;技术&#xff0c;又称为二分查找&#xff0c;它的前提是线性表中的记录必须是关键码有序&#xff08;通常从小到大有序&#xff09;&#xff0c;线性表必须…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...