opencv学习笔记2:卷积、均值滤波、中值滤波

news2025/6/9 12:39:47

目录

一、卷积概念

1.定义

2.数学原理

3.实例计算

(1) 输入与卷积核

(2)计算输出 g(2,2)

4.作用

二、针对图像噪声的滤波技术——均值滤波

1.均值滤波概念

(1)均值滤波作用

(2)计算方式

(3)均值滤波的缺点

2.均值滤波计算

3.均值滤波 核心函数

(1)cv2.filter2D() ——自定义卷积核

(2)cv.blur()——均值滤波专用函数

 总代码:

代码解释

均值滤波结果:

三.中值滤波

1.定义

2.选择滤波方法

3.中值滤波原理

4.核心函数

 5.总代码

详细解释 添加椒盐噪声函数:

最后还是用subplot将图片并排比较看着明显:



 

一、卷积概念

1.定义

在图像处理领域,卷积是一种极其重要且基础的数学运算。它的核心思想利用一个小矩阵,即卷积核(也常被称为滤波器),在输入图像上进行滑动操作。在滑动过程中,对于图像上的每个位置,卷积核会与该位置周围邻域内的像素进行相互作用。具体来说,就是将卷积核的每个元素与对应位置邻域内的像素值相乘,然后将这些乘积进行求和,得到的结果作为该位置新的像素值通过这样的方式,对图像上的所有位置都进行处理后,最终生成经过卷积操作处理后的新图像。卷积操作就像是一个“特征提取器”,能够根据卷积核的不同设计,提取出图像中不同的特征信息。

2.数学原理

设输入图像为$I$,它可以看作是一个二维的像素矩阵。卷积核为$K$,同样是一个二维矩阵。卷积操作输出图像 $O$ 中每个像素值 $O(i,j)$ 由以下公式计算得出:

$g(x,y)=\sum_{u=-k}^{k}\sum_{v=-l}^{l}f(x+u,y+v)h(u,v)$其中,k和l分别是卷积核在x和y方向上的半径。这个公式的含义是,对于输出图像 $g$ 中坐标为$(x,y)$的像素,需要在输入图像 $f$ 中以 $(x,y)$ 为中心,取与卷积核大小(2k+1)×(2l+1)相同的邻域。然后,将该邻域内的像素值与卷积核 $h$ 对应位置的元素值相乘,并将所有乘积相加,得到的和就是输出图像 $g$ 中 $(x,y)$ 位置的像素值。通过这个公式,卷积操作能够系统地对图像的每个像素进行处理,从而实现对图像的各种变换。

  • g :输出图像,g(x,y) 表示卷积后坐标 (x,y) 处的像素值
  • f:输入图像(二维像素矩阵),f(x,y) 表示坐标 (x,y) 处的像素值
  • h:卷积核(二维矩阵,如 3×3 边缘检测核),h(u,v) 表示卷积核第 u 行、第 v 列的权重
  • u,v为卷积核内的相对坐标,k和l分别是卷积核在x和y方向上的半径,通常卷积核大小为 (2k+1)×(2l+1)

3.实例计算

(1) 输入与卷积核

假设:

  • 输入图像 I(灰度图,截取 5×5 局部):

  • 卷积核 K(均值模糊核,3×3,权重均为 1/9):

(2)计算输出 g(2,2)

假设输入图像是一个 5×5 的矩阵,卷积核是一个 3×3 的矩阵。

输入图像矩阵

卷积核矩阵

这里,卷积核的尺寸为 3×3,因此 k=1,l=1。我们需要计算输出图像中的 g (2,2)。

根据卷积公式:$g(2,2)=\sum_{u=-1}^{1}\sum_{v=-1}^{1}f(2+u,2+v)h(u,v)$

我们需要计算所有 u 和 v 的组合(-1,0,1)对应的乘积并求和:

代入具体数值:

所以,g (2,2) 的值为 - 8。

4.作用

卷积操作在图像处理中具有广泛的应用,它能够改变图像的特征,以满足不同的处理需求。在图像滤波任务中,卷积可以去除图像中的噪声,使图像更加平滑;在边缘检测中,通过特定的卷积核设计,能够突出图像中像素值变化较大的区域,即图像的边缘;在特征提取方面,卷积能够提取出图像中的各种特征,如纹理、形状等,为后续的图像识别、目标检测等任务提供重要的信息。可以说,卷积操作是许多高级图像处理算法的基础。

二、针对图像噪声的滤波技术——均值滤波

图像噪声 是图像处理中常见的问题,它是由于各种原因引入的不希望的随机变化或干扰,导致图像质量下降。噪声可以出现在图像的亮度、颜色和纹理等方面,对图像分析、计算机视觉和图像处理任务造成困难。为了减少或消除图像中的噪声,常常使用不同类型的滤波技术。

高斯噪声:这是一种典型的连续随机噪声,其分布类似于高斯分布。它通常由电子器件或传感器的随机波动引起,会导致图像中像素值的微小随机变化

椒盐噪声:这是一种离散的随机噪声,通常表现为图像中的亮点和暗点,类似于椒盐的颗粒。这种噪声可能是由于传感器损坏或数据传输错误引起的。

均匀噪声:均匀噪声是一种均匀分布的随机噪声,它在图像中引入一种均匀的背景噪声,会降低图像对比度。

波纹噪声:这种噪声表现为图像中的周期性亮度和暗度变化,通常是由于光照不均匀或传感器故障引起的。

1.均值滤波概念

均值滤波概定义:均值滤波是一种线性平滑滤波方法,它通过将每个像素周围的像素值的平均值替换当前像素值来减小噪声。在图像处理中常用于降噪(如消除随机噪声点),但会以模糊图像细节为代价 

(1)均值滤波作用

均值滤波是一种简单而有效的滤波技术,用于去除图像中的噪声。均值滤波对于轻度高斯噪声去除效果良好因为噪声通常表现为图像中随机出现的、与周围像素值差异较大的像素点,通过均值滤波的平均操作,可以使这些噪声点的影响被周围像素值所“稀释”,但在去除噪声的同时可能会导致图像细节的模糊。

(2)计算方式

均值滤波基于一个小的滑动窗口,将窗口中像素的平均值分配给窗口中心的像素。这个操作在整个图像上以滑动窗口的方式进行。它所使用的均值卷积核具有这样的特点:核内所有元素值相同,并且这些元素值的总和为 1。在进行均值滤波时,卷积核在图像上滑动,对于每个位置的邻域像素,将它们的像素值进行简单的平均计算,得到的平均值作为该位置新的像素值。

(3)均值滤波的缺点

由于它对邻域内所有像素一视同仁地进行平均,在平滑噪声的同时,也可能会使图像的边缘变得模糊。因为图像的边缘通常是像素值变化较为剧烈的区域,均值滤波的平均操作会削弱这种变化,导致边缘的清晰度下降。

2.均值滤波计算

均值滤波是一种常见的线性滤波操作,核心是用卷积核覆盖区域内像素的平均值来替换中心像素值,以下用实例计算g (2,2):

3.均值滤波 核心函数

(1)cv2.filter2D() ——自定义卷积核

# 定义均值卷积核
kernel = np.ones((5, 5), np.float32) / 25
# 进行卷积操作(核心步骤)
dst = cv2.filter2D(image, -1, kernel)

① kernel = np.ones((5, 5), np.float32) / 25  解释:

  • 创建一个 5×5 的矩阵,所有元素初始化为 1(ones)
  • 每个元素除以 25(即 1/25 = 0.04
  • 这样的卷积核表示:取周围 25 个像素的平均值
  • 卷积核越大会产生更强的平滑效果,但也会使图像边缘和细节更模糊

② dst = cv2.filter2D(image, -1, kernel)    解释:

  • cv2.filter2D() 是 OpenCV 的通用卷积函数,参数如下:
    • image:输入图像
    • -1:输出图像的深度(-1 表示与输入相同)
    • kernel:使用的卷积核
  • 它会将卷积核在图像上滑动,对每个像素执行以下操作:
    1. 取出当前像素周围 5×5 区域 的像素值
    2. 将这些值与卷积核对应位置相乘(这里相当于直接求和)
    3. 将结果除以 25(即求平均值)
    4. 用这个平均值替换当前像素的值

效果: 

  • 每个像素的值被替换为其 5×5 邻域的平均值
  • 噪声点(异常值)会被周围像素 “平均化”,从而达到 平滑图像、减少噪声 的效果

(2)cv.blur()——均值滤波专用函数

blur = cv.blur(img, (5, 5))
  • cv.blur() 是 OpenCV 提供的均值滤波函数,它会用 (5,5) 大小的卷积核(5×5 窗口),对 img(输入图像)逐像素计算邻域均值,结果存入 blur,实现均值滤波的核心逻辑 。

 总代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 读取图像
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
if image is None:
    print("无法读取图像,请检查路径。")
else:
    # 定义均值卷积核
    kernel = np.ones((5, 5), np.float32) / 25
    # 进行卷积操作
    dst = cv2.filter2D(image, -1, kernel)
#上面这两行可以换成 blur = cv.blur(img, (5, 5))
    # 显示原始图像和卷积后的图像
    plt.subplot(121), plt.imshow(image, cmap='gray')
    plt.title('Original Image'), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(dst, cmap='gray')
    plt.title('Convolved Image'), plt.xticks([]), plt.yticks([])
    plt.show()
 

代码解释

  1. 读取图像:cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) 使用 OpenCV 的 imread 函数以灰度模式读取图像文件 example.jpg。灰度模式下,图像被表示为单通道矩阵,更便于进行滤波操作。如果图像读取失败,即返回值为 None,则打印提示信息,告知用户检查图像路径是否正确。
  2. 定义均值卷积核:kernel = np.ones((5, 5), np.float32) / 25 使用 NumPy 库创建一个大小为 5×5 的矩阵,其中所有元素初始值都为 1。然后将每个元素除以 25,使得卷积核内所有元素值的总和为 1,符合均值卷积核的要求。
  3. 进行卷积操作:dst = cv2.filter2D(image, -1, kernel) 使用 OpenCV 的 filter2D 函数对输入图像 image 进行二维卷积操作。
    • 参数1:输入图像
    • 参数 2:输出图像的深度(数据类型),决定了像素值的范围。ddepth = -1:表示输出图像的深度与输入图像相同(例如输入是uint8,输出也为uint8)。
    • 参数 3:kernel 则是前面定义的均值卷积核。
    • 函数返回经过卷积处理后的图像 dst。
  4. 显示原始图像和卷积后的图像:使用 matplotlib 库的 subplot 函数创建一个包含两个子图的绘图布局。plt.subplot(121),这里的1表示整个绘图区域被分成 1 行,2表示分成 2 列,最后的1代表当前操作的是第 1 个子图,表示第一个子图位于 1 行 2 列的第 1 个位置。plt.imshow(image, cmap='gray') 显示原始灰度图像,设置颜色映射为 gray 以正确显示灰度图像。plt.title('Original Image') 设置子图标题,plt.xticks([]) 和 plt.yticks([]) 则隐藏坐标轴刻度,使图像显示更加简洁。同理,plt.subplot(122) 显示卷积后的图像 dst,并进行相应的设置。最后 plt.show() 显示整个绘图。
  5. 使用plt.subplot(nrows, ncols, index)创建子图时,最后创建的子图会成为当前活跃子图。plt.xticks([])plt.yticks([])等函数默认作用于当前活跃的子图(即最后一个通过plt.subplot()创建的子图)。若连续调用plt.subplot()创建多个子图后,未明确切换子图,则后续的plt.xticks([])会应用到最后创建的子图。

均值滤波结果:

三.中值滤波

1.定义

中值滤波:中值滤波是一种非线性滤波方法,它用窗口中像素值的中值来替代当前像素的值。中值滤波的原理如下:

  • 将一个小的滑动窗口(通常是正方形的)放在图像的每个像素上。
  • 将窗口中的所有像素值排序,找到中值(即中间位置的像素值)。
  • 使用中值来替代当前像素的值。
     

中值滤波对椒盐噪声脉冲噪声的去除效果非常好,因为它不受极端值的影响。它可以保留图像的边缘和细节,但可能对高斯噪声的去除效果不如高斯滤波

2.选择滤波方法

选择适当的滤波方法取决于噪声的类型和图像的特性。通常,均值滤波对于轻度高斯噪声有效,而高斯滤波对于更强的高斯噪声适用。中值滤波通常在椒盐噪声和脉冲噪声的情况下表现良好,但不适用于高斯噪声。

此外,滤波器的窗口大小也是一个重要的参数。较小的窗口适用于去除细小的噪声,但可能会丧失图像细节。较大的窗口可以更好地去除大面积的噪声,但可能会模糊图像。综上所述,选择合适的滤波方法需要对噪声和图像进行仔细分析,以平衡噪声去除和图像细节保留之间的权衡。
 

3.中值滤波原理

 中值滤波会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值。 对如下矩阵:

将其邻域设置为3×3大小,对其3×3邻域内像素点的像素值进行排序(升序降序均可),按升序排序后得到序列值为:[66,78,90,91,93,94,95,97,101]。在该序列中,处于中心位置(也叫中心点或中值点)的值是“93”,因此用该值替换原来的像素值78,作为当前点的新像素值。中值滤波效果如下:

4.核心函数

 在OpenCV中,实现中值滤波的函数是cv2.medianBlur(),其语法格式如下:

         dst=cv2.medianBlur(src,ksize)
  • dst是返回值,表示进行中值滤波后得到的处理结果。
  • src 是需要处理的图像,即源图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F中的一种。   
  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,核大小必须是比1大的奇数,比如3、5、7等。 例如:ksize=3 表示使用 3×3 的邻域窗口。

 5.总代码

import cv2  as cv
 
def cv_show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)
    cv.destroyAllWindows()
 
#添加椒盐噪声函数
def add_peppersalt_noise(image, n=10000):
    result = image.copy()
    # 测量图片的长和宽
    w, h =image.shape[:2]
    # 生成n个椒盐噪声
    for i in range(n):
        x = np.random.randint(1, w)
        y=  np.random.randint(1, h)
        if np.random.randint(0, 2) == 0 :
            result[x, y] = 0
        else:
            result[x,y] = 255
    return result
 
#读图像
img = cv.imread('D:\\dlam.jpg')
if img is None:
    print('Failed to read the image')
#添加椒盐噪声
img1 = add_peppersalt_noise(img)
cv_show('after', img1)
 
# 中值滤波,可对灰色图像和彩色图像使用
img2 = cv.medianBlur(img1, 3)
cv_show('after1', img2)
# ksize变大图像变模糊
img3 = cv.medianBlur(img1, 9)
cv_show('after2', img3)

详细解释 添加椒盐噪声函数:

#添加椒盐噪声函数
def add_peppersalt_noise(image, n=10000):
    result = image.copy()
    # 测量图片的长和宽
    w, h =image.shape[:2]
    # 生成n个椒盐噪声
    for i in range(n):
        x = np.random.randint(1, w)
        y=  np.random.randint(1, h)
        if np.random.randint(0, 2) == 0 :
            result[x, y] = 0
        else:
            result[x,y] = 255
    return result
  •  add_peppersalt_noise(image, n=10000)参数
    • image:输入图像,是一个 NumPy 数组,数据类型通常为uint8
    • n:要添加的噪声点数量,默认值为 10000。
  • np.random.randint(0, w):生成一个范围在[0, w-1)之间的随机整数,这里的w是图像的宽度。
  • np.random.randint(0, h):生成一个范围在[0, h-1)之间的随机整数,h是图像的高度。
  • np.random.randint(0, 2):生成随机整数 0 或者 1,且生成这两个数的概率是相等的。
  • 噪声类型判断
    • 当结果为 0 时,把当前像素值设为 0,也就是黑色,这就是 “椒噪声”。
    • 当结果为 1 时,将当前像素值设为 255,即白色,这就是 “盐噪声”。

最后还是用subplot将图片并排比较看着明显:

import cv2
import numpy as np
import matplotlib.pyplot as plt
def add_peppersalt_noise(img,n=10000):
    result=img.copy()
    h,w=img.shape[:2]
    for i in range(n):
        x=np.random.randint(1,w)
        y=np.random.randint(1,h)
        if np.random.randint(0,2)==0:
            result[x,y]=0
        else:
            result[x,y]=255
    return result


img=cv2.imread('Y:\\pycharm\\lion.png',cv2.IMREAD_GRAYSCALE)
if img is None:
    print('无法读取')
else:
    img1=add_peppersalt_noise(img)
    img2=cv2.medianBlur(img1,3)
    img3=cv2.medianBlur(img1,5)
    plt.subplot(131),plt.imshow(img1,cmap='gray')
    plt.title('img1'),plt.xticks([]),plt.yticks([])
    plt.subplot(132), plt.imshow(img2, cmap='gray')
    plt.title('img2'), plt.xticks([]), plt.yticks([])
    plt.subplot(133), plt.imshow(img3, cmap='gray')
    plt.title('img3'), plt.xticks([]), plt.yticks([])
    plt.show()

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

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

相关文章

在 Android Studio 中使用 GitLab 添加图片到 README.md

1. 将图片文件添加到项目中 在项目根目录下创建一个 images 或 assets 文件夹 将你的图片文件(如 screenshot.png)复制到这个文件夹中 2. 跟提交项目一样,提交图片到 GitLab 在 Android Studio 的 Git 工具窗口中: 右键点击图片…

HarmonyOS:如何在启动框架中初始化HMRouter

应用启动时通常需要执行一系列初始化启动任务,如果将启动任务都放在应用主模块(即entry类型的Module)的UIAbility组件的onCreate生命周期中,那么只能在主线程中依次执行,不但影响应用的启动速度,而且当启动…

Web3 借贷与清算机制全解析:链上金融的运行逻辑

Web3 借贷与清算机制全解析:链上金融的运行逻辑 超额抵押借款 例如,借款人用ETH为抵押借入DAI;借款人的ETH的价值一定是要超过DAI的价值;借款人可以任意自由的使用自己借出的DAI 稳定币 第一步:借款人需要去提供一定…

【Vue3】(三)vue3中的pinia状态管理、组件通信

目录 一、vue3的pinia 二、【props】传参 三、【自定义事件】传参 四、【mitt】传参 五、【v-model】传参(平常基本不写) 六、【$attrs】传参 七、【$refs和$parent】传参 八、provide和inject 一、vue3的pinia 1、什么是pinia? pinia …

Jenkins自动化部署Maven项目

Jenkins自动化部署Maven项目 一、环境准备(Prerequisites) SpringBoot项目 确保项目根目录有标准Maven结构(pom.xml)且包含Dockerfile: # Dockerfile 示例 FROM openjdk:11-jre-slim VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["j…

LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上

题目:1667. 修复表中的名字 题解: select user_id, concat(upper(left(name,1)),lower(right(name,length(name)-1))) name from Users order by user_id题目:1527. 患某种疾病的患者 题解: select * from Patients where con…

Python 中 Django 中间件:原理、方法与实战应用

在 Python 的 Web 开发领域,Django 框架凭借其高效、便捷和功能丰富的特点备受开发者青睐。而 Django 中间件作为 Django 框架的重要组成部分,犹如 Web 应用的 “交通枢纽”,能够在请求与响应的处理流程中,实现对请求和响应的拦截…

深入浅出玩转物联网时间同步:基于BC260Y的NTP实验与嵌入式仿真教学革命

在万物互联的时代,精准的时间戳是物联网系统的神经节拍器,而NTP协议正是维持这一节律的核心技术。 一、时间同步:物联网世界的隐形基石 在智慧城市、工业4.0等场景中,分散的设备需要毫秒级的时间协同。网络时间协议(N…

【在线五子棋对战】二、websocket 服务器搭建

文章目录 Ⅰ. WebSocket1、简介2、特点3、原理解析4、报文格式 Ⅱ. WebSocketpp1、认识2、常用接口3、websocketpp库搭建服务器搭建流程主体框架填充回调函数细节 4、编写 makefile 文件5、websocket客户端 Ⅰ. WebSocket 1、简介 WebSocket 是从 HTML5 开始支持的一种网页端…

C++课设:从零开始打造影院订票系统

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、项目背景与需求分析二、系统架构设计…

【计算机网络】数据链路层-滑动窗口协议

数据链路层滑动窗口协议 1. 三种协议对比表 特性停止-等待协议GBN协议SR协议窗口大小发送 1&#xff0c;接收 1发送 W (1<W≤2ⁿ-1)&#xff0c;接收 1发送 C&#xff0c;接收 R确认方式单个确认累积确认选择性确认重传策略超时重传回退N帧重传选择性重传接收缓冲区…

在linux系统上,如何安装Elasticsearch?

1.问题描述 当尝试连接时报错&#xff0c;报错内容为&#xff1a; elastic_transport.ConnectionError: Connection error caused by: ConnectionError(Connection error caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7fd808b179d0>:…

wpf Behaviors库实现支持多选操作进行后台绑定数据的ListView

<ListView ItemsSource"{Binding SchemeItems}" SelectionMode"Extended" VerticalAlignment"Stretch" HorizontalAlignment"Stretch"><ListView.ContextMenu><ContextMenu><MenuItem Header"删除" …

《Vuejs设计与实现》第 8 章(挂载与更新)

目录 8.1 挂载子节点与属性 8.2 HTML Attributes 与 DOM Properties 8.3 设置元素属性的正确方式 8.4 处理 class 属性 8.5 卸载操作 8.6 区分 vnode 类型 8.7 事件处理优化 8.8 事件冒泡与更新时机问题 8.9 子节点的更新 8.10 文本节点和注释节点 8.11 片段&#xf…

Ubuntu20.04中 Redis 的安装和配置

Ubuntu20.04 中 Redis 的安装和配置 Ubuntu 安装 MySQL 及其配置 1. Redis 的安装 更新系统包列表并安装 Redis &#xff1a; # 更新包管理工具 sudo apt update# -y&#xff1a;自动确认所有提示&#xff08;非交互式安装&#xff09; sudo apt install -y redis-server测…

实验四:图像灰度处理

实验四 图像处理实验报告 目录 实验目的实验内容 原理描述Verilog HDL设计源代码Testbench仿真代码及仿真结果XDC文件配置下板测试 实验体会实验照片 实验目的 在实验三的基础上&#xff0c;将图片显示在显示器上&#xff0c;并进行灰度处理。 实验内容 原理描述 1. 图片的…

解析“与此站点的连接不安全”警告:成因与应对策略

一、技术本质&#xff1a;SSL/TLS协议的信任链断裂 现代浏览器通过SSL/TLS协议建立加密通信&#xff0c;其核心在于证书颁发机构&#xff08;CA&#xff09;构建的信任链。当用户访问网站时&#xff0c;浏览器会验证服务器证书的有效性&#xff0c;包括&#xff1a; 证书链完…

⚡️ Linux Docker 基本命令参数详解

&#x1f433; Linux Docker 基本命令参数详解 &#x1f4d8; 1. Docker 简介 Docker 是一个开源的容器化平台&#xff0c;它通过将应用及其依赖打包到一个轻量级、可移植的容器中&#xff0c;从而实现跨平台运行。Docker 采用 C/S 架构&#xff0c;服务端称为 Docker Daemon&a…

做题笔记(ctfshow)

一。ctfshow web13 文件扫描 存在upload.php.bak <?php header("content-type:text/html;charsetutf-8");$filename $_FILES[file][name];$temp_name $_FILES[file][tmp_name];$size $_FILES[file][size];$error $_FILES[file][error];$arr pathinfo($fi…

Agent短期记忆的几种持久化存储方式

今天给大家讲一下关于Agent长期对话的几种持久化存储方式&#xff0c;之前的文章给大家说过短期记忆和长期记忆&#xff0c;短期记忆基于InMemorySaver做checkpointer&#xff08;检查点&#xff09;&#xff0c;短期记忆 &#xff08;线程级持久性&#xff09; 使代理能够跟踪…