当前位置: 首页 > 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;线性表必须…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...