# 完善智能体function **Repository Path**: youtingyang/add-agent-function ## Basic Information - **Project Name**: 完善智能体function - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-21 - **Last Updated**: 2026-06-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 结合关键点识别和图像匹配的智能 Agent 系统 ## 个人信息 [TODO: 此处填写个人信息] - 学号: 202452320229 - 年级: 2024级 - 专业: 智能科学与技术 - 班级: 2班 - 姓名: 杨悠婷 ## 项目介绍 这是一个基于 ORB (Oriented FAST and Rotated BRIEF) 算法的智能视觉分析系统,集成了: - 实时关键点检测 - 图像匹配与相似度计算 - 多图对比与排序 - 技能保存与复用 - 智能对话交互 - FFT图像处理(压缩/去噪/边缘检测) ### 核心技术 - 后端:FastAPI + OpenCV + NumPy + Matplotlib - 前端:HTML5 + CSS3 + JavaScript - 算法:ORB 特征提取 + Hamming 距离匹配 + FFT 频域处理 - 实时通信:WebSocket ## 软件架构 ### 目录结构 ``` Agent-master/ ├── backend/ # 后端服务 │ ├── main.py # 主程序入口 │ ├── requirements.txt # 依赖包 │ ├── modules/ # 核心模块 │ ├── uploads/ # 用户上传目录 │ └── outputs/ # 处理结果输出目录 └── frontend/ # 前端界面 ├── index.html # 页面结构 ├── styles.css # 样式 └── app.js # 交互逻辑 ``` ### 核心功能模块 1. 视觉分析:关键点检测、图像匹配、多图对比 2. 智能对话:自然语言交互、意图识别 3. 技能系统:操作轨迹记录、保存、执行、删除 4. FFT图像处理:压缩、去噪、边缘检测 5. 安全防护:XSS 防护、文件验证、路径安全 ## 安装和运行 ### 环境要求 - Python 3.8+ - 现代浏览器(Chrome、Firefox、Edge) ### 1. 安装依赖 ```bash cd backend pip install -r requirements.txt ``` ### 2. 启动服务 ```bash python -m uvicorn main:app --host 0.0.0.0 --port 8003 --reload ``` 或使用: ```bash python main.py ``` ### 3. 访问应用 在浏览器打开: ``` http://localhost:8003 ``` ## 使用说明 ### 图像选择 - 在左侧「图像库」点击选择图像 - 支持多选(用于多图对比) ### 视觉工具使用 | 工具 | 功能 | 需选择图片数 | |------|------|---------------| | 检测关键点 | 检测图像 ORB 特征点 | 1 张 | | 匹配图像 | 对比两张图像 | 2 张 | | 列出所有图像 | 查看可用图像 | 0 张 | | 多图对比 | 与所有图像比较相似度 | 1 张 | | FFT 去噪 | 频域低通滤波去除噪声 | 1 张 | | FFT 边缘检测 | 频域高通滤波提取边缘 | 1 张 | | FFT 压缩 | 频域压缩(保留低频) | 1 张 | | FFT 多比例对比 | 不同压缩比例对比 | 1 张 | | JPEG 压缩 | 标准JPEG图像压缩 | 1 张 | ### 技能系统使用 #### 保存技能 1. 运行一次视觉操作(使用工具或对话) 2. 在 Agent 回复下方点击「保存为技能」 3. 输入技能名称和描述 #### 执行技能 - 在右侧「技能」面板点击任意技能卡片 - 或点击技能上的执行按钮 - 可选新图片执行,或使用原图片 #### 删除技能 - 点击技能上的删除按钮 - 确认后删除 ### 智能对话 | 场景 | 示例 | |------|------| | 问候 | 你好、hello | | 询问 | 你能做什么、怎么用 | | 感谢 | 谢谢、thanks | | 告别 | 再见、bye | | 夸奖 | 厉害、好棒 | ## 安全特性 - XSS 攻击防护(HTML 转义) - 文件类型验证 - 文件大小限制 - 路径遍历防护 - 输入参数验证 ## 算法说明 ### ORB 算法 - FAST 角点检测:快速定位特征点 - BRIEF 描述符:二进制特征描述 - 旋转不变性:支持旋转鲁棒性 - 尺度不变性:多尺度检测 ### 匹配策略 - Hamming 距离:二进制描述符距离 - RANSAC:剔除误匹配 - 单应性矩阵:计算变换 - 相似度评分:0-100% --- # 傅里叶变换在图像处理中的应用:从指纹刑侦到数据压缩 ## 指纹刑侦的三个难题 ### 早期指纹管理的困境 最早在还没有计算机技术的时候,指纹都是以纸质形式存放在库房里的。每周都有来自各个地方的需要比对指纹的请求成千上万,而这些比对都需要靠手工完成。 ![纸质指纹存储](https://secure2.wostatic.cn/static/sx2dBMkRuWN3GmHfY7mrcK/image.png) ![手工比对指纹](https://secure2.wostatic.cn/static/dHoHV8K8ccTqUACdMyfhXU/image.png) ### 三个核心难题 | 难题 | 描述 | 影响程度 | |------|------|----------| | **1. 物理存储空间过大** | 纸质指纹需要大量柜子存放 | ⭐⭐⭐⭐⭐ | | **2. 比对速度过慢** | 手工比对效率极低 | ⭐⭐⭐⭐⭐ | | **3. 邮寄速度过慢** | 异地传输耗时过长 | ⭐⭐⭐⭐⭐ | 如何利用有限的空间,在有限的时间内更好地解决这些问题呢? --- ## 计算机技术的初步解决方案 等到终于有计算机技术的加持,我们终于可以以文件的形式存储指纹文件(一个文件大约10M左右)。 ### ✅ 问题1和问题2的解决 - **存储问题基本解决**:只需要用硬盘即可存储大量数据,比以往存放纸质材料的数据柜相比节省了大量空间 - **比对速度问题解决**:一旦拿到了计算机指纹的图片,就可以在计算机中直接通过程序对数据库中的指纹进行比对 ### ❌ 问题3仍然存在:邮寄指纹的速度过慢 很遗憾,即使利用网络传输,还是没有办法能够很好地解决这个问题。 **原因分析**: - 计算机技术初期,网络刚刚起步,最快的链接也只有 **0.03M/s** - 如果用网络来传送的话,一张指纹为 **10M** - 一周的传输量一般在 **1000~10000个** 指纹,假设取平均值一周 **5000个** 指纹 - 每周需要传输的数据量就是:$5000 \times 10 = 50,000$ M - 传输这些文件就需要:$\frac{50,000}{0.03} \approx 1,666,667秒 \approx 463小时 \approx 19天$ > **每周的数据都需要19天收集显然是不合理的!** > > 很多人命关天的案发现场,尤其是偏远地区的案发现场还等着匹配结果来破案,多等一分钟,犯罪分子就有可能逃掉了。 --- ## 数据压缩:突破传输瓶颈的关键 这个时候一个很直接的思路就是:**降低需要传输的数据的体积,即实现数据压缩,以减少传输使用的时间。** ### 压缩数据的两种形式 #### 1️⃣ 无损压缩 (Lossless Compression) **原理**:通过识别并编码重复模式来减少数据量,解压后与原始数据完全一致。 **示例**: ``` 原始数据:"你好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好"(36字节) 压缩后:"你好$#35"(6字节) 压缩比:6:1 ``` 其中 `$#` 为特殊符号,用来标识后面的数字为之前字符的重复次数。 **特点**: - ✅ 数据完全还原,无信息损失 - ✅ 适用于文本、程序代码等 - ⚠️ 压缩比较低 #### 2️⃣ 有损压缩 (Lossy Compression) **原理**:为了提升压缩比,预先设定好几个标志表示字符的重复次数,舍弃部分非核心信息。 **示例**: ``` 预设规则: * 表示重复2次 + 表示重复10次 ^ 表示重复100次 原始数据:"你好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好"(36字节) 压缩后:"你好+"(3字节) 压缩比:12:1 ``` 还原之后是:"你好好好好好好好好好好好"(虽然能表达意思,但信息与原有信息不太一致了) **特点**: - ✅ 压缩比更高 - ⚠️ 会丢失部分信息 - ⚠️ 需要谨慎选择舍去的信息 ### 核心原则 > **无损/有损压缩的一个重要前提是:「区分出核心的组成部分和非核心的组成部分」** 这种功能需求,很自然地让我们联想到了:**傅里叶变换**。 --- ## FFT2 实现图像压缩:傅里叶变换的魔力 大家能想象右边的指纹包含的信息量只有左边指纹的 **5%** 么?这就是傅里叶变换的魔力! ![FFT压缩效果对比](https://secure2.wostatic.cn/static/5y4QnRDcPQyqqemF7mpSZx/image.png?auth_key=1779345780-uKkHvtxvM9wNugK3Ak1Y6A-0-187a03e5d094483865840fab267a08e9) 有了傅里叶变换,就可以把 **19天的工作压缩到1天** 啦! ### 实现过程 ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 原始图像 │ → │ FFT2变换 │ → │ 频域滤波 │ → │ IFFT逆变换 │ │ (空间域) │ │ (频域) │ │ (保留主要) │ │ (重建图像) │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ ``` **注意**:振幅高的数据不一定都对应高频数据,图中掩码只是一个例子,实际产生的"空洞"不一定只出现在高频区域,而且对于一个比较平缓的图像,往往是出现在低频区域的。 ### 💻 演示代码:使用二维傅里叶变换实现指纹图压缩 ```python # 导入必要库 from skimage import io, color # 用于加载和处理图像 import numpy as np # 用于数值计算 from matplotlib import pyplot as plt # 用于图像可视化 import cv2 # 用于图像加载和基本操作 # ########## 1. 数据准备 ########## # 读取灰度图像 img = cv2.imread("fp1.jpg", 0) # 从路径读取图像,模式为灰度图 # 计算图像的二维快速傅里叶变换,得到频率系数 fCoef = np.fft.fft2(img) # 对图像进行傅里叶变换 mag_spec = np.abs(fCoef) # 计算振幅谱(绝对值) mag_spec_sorted = np.sort(mag_spec.ravel()) # 将振幅谱展开并排序 # ########## 2. 数据压缩 ########## # 定义压缩比例列表 compression_ratios = [0.05, 0.01, 0.005, 0.001] # 不同压缩比的列表 # 初始化画布并显示原始图像 fg, ax = plt.subplots(1, 5, figsize=(20, 10)) # 创建子图,展示5幅图像 ax[0].imshow(img, cmap='gray') # 显示原始图像 ax[0].set_title("原图像", fontsize=15) # 设置标题 # 循环处理不同压缩比例 for i, keep in enumerate(compression_ratios): # 计算保留振幅的阈值 thresh = mag_spec_sorted[int((1 - keep) * img.size)] # 根据压缩比计算阈值 # 创建掩码,保留振幅大于阈值的频率分量 mask = mag_spec > thresh # 振幅大于阈值的频率分量被保留 # 使用掩码压缩傅里叶系数 fCoef_compressed = fCoef * mask # 压缩后频率系数 # ########## 3. 数据重建 ########## # 使用压缩后的傅里叶系数进行逆傅里叶变换 img_cp = np.fft.ifft2(fCoef_compressed).real # 傅里叶逆变换 # 将灰度图像转换为二值图像(简化为黑白图) img_cp = img_cp > 130 # 二值化阈值为130 # ########## 4. 可视化 ########## # 显示压缩后的图像 ax[i + 1].imshow(img_cp, cmap='gray') # 显示图像 ax[i + 1].set_title(f"压缩比例:{keep}", fontsize=15) # 设置标题 # 调整布局 plt.tight_layout() plt.show() ``` ### 代码运行结果 ![FFT压缩结果对比](https://secure2.wostatic.cn/static/86Bqf62UT9wWZwrqbvHuDp/image.png) ### 代码原理详解 | 步骤 | 操作 | 说明 | |------|------|------| | **1. 读取图像** | `cv2.imread("fp1.jpg", 0)` | 读取指定路径下的图像文件,转换为灰度图像 | | **2. FFT变换** | `np.fft.fft2(img)` | 计算二维快速傅里叶变换(2D Fast Fourier Transform),得到频域中的傅里叶系数 | | **3. 计算振幅谱** | `np.abs(fCoef)` | 计算傅里叶系数的绝对值,得到振幅谱 | | **4. 排序** | `np.sort(mag_spec.ravel())` | 将振幅谱展开并排序,便于确定阈值 | | **5. 创建掩码** | `mask = mag_spec > thresh` | 根据压缩比计算阈值,创建布尔掩码 | | **6. 压缩系数** | `fCoef * mask` | 使用掩码保留主要频率成分 | | **7. 逆变换** | `np.fft.ifft2()` | 傅里叶逆变换重建图像 | | **8. 二值化** | `img_cp > 130` | 将灰度图像转换为二值图像 | ### 注意事项 1. ✅ 确保已正确安装 `cv2` 和 `matplotlib` 库 2. ✅ 确保图像文件 `"fp1.jpg"` 存在于程序所在目录中 3. ⚠️ 本例中的压缩比例和阈值设置可能并不适用于所有图像,可能需要针对具体图像进行调整 4. ⚠️ 由于图像处理涉及到复杂数值计算,运行速度可能受到计算能力的限制 --- ## JPEG(JPG)格式的简要过程 ### 什么是 JPEG? **JPEG**: A **J**oint **P**hotographic **E**xperts **G**roup (联合图片专家组) standard (标准) 它是互联网上**最普通的压缩图像**的方法之一。 > **注意**:JPG 和 JPEG 格式实际上没有区别,唯一的区别是文件后缀名使用的字符数。 ### JPEG 的压缩效果 ![JPEG压缩效果](https://secure2.wostatic.cn/static/e6Dacgmq1HagenYaswJV3s/image.png?auth_key=1779345791-edoN21fpGKSX5cE8oPif9p-0-56d090507c3fd34d0c985819ea73967f) 从以上截图我们可以看出: - 一个在硬盘中只占用空间为 **21k** 的图像 - 打开后在内存中实际占用的空间是 **264k**(被放大了十倍) - JPG 文件在存储的时候,大小被压缩到了原始图像的**十分之一** ![JPEG内存占用](https://secure2.wostatic.cn/static/c3www1aWYS5VBpe1hXH8wD/image.png?auth_key=1779345791-6Y3SFkNdbEtNo7e1YXjPQe-0-1205a367ffea185cbbd759dc2e877b92) 这种**高压缩比**和对**图像细节的最大程度的保留**的平衡就是 ≈ **靠傅里叶变换实现的**! ### JPEG 压缩流程 #### 步骤1:图像分块 想要生成一个 JPEG 文件,一个完整的图像首先被分成了很多的 $8 \times 8$ 的子区域: ![JPEG图像分块](https://secure2.wostatic.cn/static/vrTqRbwNe5m3NAgAAXY6js/image.png?auth_key=1779345791-fg5mKfT7Af1AUiqoRTtP1w-0-f2c29ae89fe9c582955cb54161b9c7af) 然后依次针对每一个区域独立进行傅里叶变换。 #### 步骤2:频率分解 因为每个区域只有 **64个像素**,所以在用傅里叶变换时,针对每一个区域只需要用 **64个子频率**去测试这个区域就够了: ![JPEG频率分布](https://secure2.wostatic.cn/static/3GM93uELcR6MQKbAAbn196/image.png?auth_key=1779345791-xoYR84KBKpmRJY79jdRuHM-0-33d5d349f0fffaba541a0234cbf6d0ea) - **左上角为 DC 频率**(直流分量,表示平均亮度) - 向右 → 向下 ↓ **频率均逐渐升高** - **左上部为低频信号**(主要信息,能量集中) - **右下部为高频信号**(细节信息,能量分散) #### 步骤3:计算傅里叶系数 计算出每一个频率的傅里叶系数后,得到一个 $8 \times 8$ 的傅里叶系数矩阵: ![JPEG傅里叶系数矩阵](https://secure2.wostatic.cn/static/3Wtkb1KgeJ4hpZLG5YLmMR/image.png?auth_key=1779345791-mWKcUoxVkSUhmipyw5Sq1m-0-2aefe6536c1f630b3122345c10a4f2a9) **重要观察**: - 一般情况下:**左上部分比右下部分的系数绝对值更大** - 因为一个图像中一个 $8 \times 8$ 的区域中有大量高频数据的概率还是较小的 #### 步骤4:量化压缩 然后再在压缩软件中选择想要保留的精度,软件就会根据精度产生一个**量化矩阵**(类似于掩模): ![JPEG量化矩阵](https://secure2.wostatic.cn/static/cJiCFwc61RyTkKqFBLLue2/image.png?auth_key=1779345791-baxEwgzhranXkKsazVHFkg- 量化矩阵的作用: - 对每个频率系数进行除法运算 - 高频区域使用较大的除数(更多量化,更多压缩) - 低频区域使用较小的除数(较少量化,保留更多信息) - 通过调整量化矩阵可以控制压缩质量和文件大小 ### JPEG 压缩完整流程图 ``` ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 原始图像 │ → │ 颜色转换 │ → │ 8×8分块 │ → │ DCT变换 │ → │ 量化压缩 │ → │ 熵编码 │ │ RGB/CMYK │ │ YCbCr │ │ │ │ (类似FFT)│ │ (丢弃高频)│ │ Huffman │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ↓ ┌──────────┐ │ .jpg文件 │ └──────────┘ ``` ### 为什么 JPEG 如此高效? | 特性 | 说明 | |------|------| | **利用人眼特性** | 人眼对亮度变化敏感,对颜色变化不敏感;对低频敏感,对高频不敏感 | | **分块处理** | 8×8小块独立处理,便于并行计算 | | **有损+无损结合** | DCT+量化是有损的,熵编码是无损的 | | **可调质量** | 用户可以选择质量等级(0-100) | --- ## 本项目已实现的 FFT 功能 基于上述理论,本项目已经实现了以下基于傅里叶变换的图像处理功能: ### ✅ 已完成功能列表 | 功能 | 状态 | 说明 | |------|------|------| | **FFT 图像压缩** | ✅ 已实现 | 保留中心低频,支持4种压缩级别(low/medium/high/extreme),彩色图像处理,左右对比显示 | | **FFT 图像去噪** | ✅ 已实现 | 高斯低通滤波器滤除高频噪声 | | **FFT 边缘检测** | ✅ 已实现 | 高通滤波器提取边缘轮廓 | | **FFT 多比例对比** | ✅ 已实现 | 同时展示不同压缩比例的效果 | | **JPEG 压缩** | ✅ 已实现 | 标准JPEG图像压缩,可调质量参数 | | **ORB 关键点检测** | ✅ 已实现 | FAST+BRIEF特征提取 | | **图像匹配** | ✅ 已实现 | Hamming距离+RANSAC匹配 | | **多图对比检索** | ✅ 已实现 | 在图库中检索相似图像 | ### 使用方法 1. 从图像库选择要处理的图片 2. 点击对应工具按钮: - **FFT压缩** - 频域压缩,支持4种级别(low/medium/high/extreme) - **FFT去噪** - 去除高频噪声 - **FFT边缘检测** - 提取边缘轮廓 - **FFT多比例对比** - 同时对比不同压缩比例 - **JPEG压缩** - 标准JPEG压缩 - **检测关键点** - ORB特征检测 - **匹配图像** - 两张图像特征匹配 - **多图对比** - 在图库中检索相似图像 3. 查看处理结果(原图与处理结果在对话框中对比显示) ### 技术栈 - **后端框架**:FastAPI + OpenCV + NumPy + Matplotlib - **前端界面**:HTML5 + CSS3 + JavaScript - **通信方式**:WebSocket 实时交互 - **算法基础**:ORB 特征提取 + Hamming 距离匹配 + 离散傅里叶变换 (DFT/FFT) ## 参与贡献 1. Fork 本仓库 2. 创建 Feature 分支 3. 提交代码 4. Pull Request