diff --git a/analyze-unused-images.js b/analyze-unused-images.js
new file mode 100644
index 0000000..cb8940e
--- /dev/null
+++ b/analyze-unused-images.js
@@ -0,0 +1,253 @@
+#!/usr/bin/env node
+
+const fs = require('fs');
+const path = require('path');
+const glob = require('glob');
+
+/**
+ * 分析未使用的图片资源
+ * 扫描 src/blogs/ 目录下的 .assets 文件夹中的图片文件
+ * 检查这些图片是否在对应的 markdown 文件中被引用
+ */
+
+// 支持的图片格式
+const imageExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.svg', '.webp'];
+
+// 博客目录
+const blogsDir = './src/blogs';
+
+// 获取所有assets目录中的图片文件
+function getAllAssetImages() {
+ const assetImages = [];
+
+ try {
+ // 使用 glob 匹配所有 .assets 目录下的文件
+ const assetFiles = glob.sync(`${blogsDir}/**/*.assets/**/*`, { nodir: true });
+
+ assetFiles.forEach(filePath => {
+ const ext = path.extname(filePath).toLowerCase();
+ if (imageExtensions.includes(ext)) {
+ assetImages.push({
+ fullPath: filePath,
+ fileName: path.basename(filePath),
+ blogName: path.dirname(filePath).split('/').pop().replace('.assets', ''),
+ relativePath: path.relative(blogsDir, filePath)
+ });
+ }
+ });
+ } catch (error) {
+ console.error('读取assets目录时出错:', error.message);
+ }
+
+ return assetImages;
+}
+
+// 获取所有markdown文件
+function getAllMarkdownFiles() {
+ const markdownFiles = [];
+
+ try {
+ const mdFiles = glob.sync(`${blogsDir}/*.md`);
+
+ mdFiles.forEach(filePath => {
+ markdownFiles.push({
+ fullPath: filePath,
+ fileName: path.basename(filePath),
+ blogName: path.basename(filePath, '.md')
+ });
+ });
+ } catch (error) {
+ console.error('读取markdown文件时出错:', error.message);
+ }
+
+ return markdownFiles;
+}
+
+// 读取markdown文件内容并提取图片引用
+function extractImageReferences(mdFilePath) {
+ try {
+ const content = fs.readFileSync(mdFilePath, 'utf8');
+ const imageRefs = new Set();
+
+ // 匹配  格式的图片引用
+ const markdownImageRegex = /!\[[^\]]*\]\(([^)]+)\)/g;
+ let match;
+ while ((match = markdownImageRegex.exec(content)) !== null) {
+ imageRefs.add(match[1]);
+ }
+
+ // 匹配 HTML img 标签
+ const htmlImageRegex = /]+src=['"]*([^'">\s]+)['"]*[^>]*>/g;
+ while ((match = htmlImageRegex.exec(content)) !== null) {
+ imageRefs.add(match[1]);
+ }
+
+ return Array.from(imageRefs);
+ } catch (error) {
+ console.error(`读取文件 ${mdFilePath} 时出错:`, error.message);
+ return [];
+ }
+}
+
+// 检查图片是否被使用
+function isImageUsed(imagePath, imageFileName, blogName, allMarkdownFiles) {
+ // 首先检查对应的markdown文件
+ const correspondingMdFile = allMarkdownFiles.find(md => md.blogName === blogName);
+
+ if (correspondingMdFile) {
+ const imageRefs = extractImageReferences(correspondingMdFile.fullPath);
+
+ // 检查是否有任何引用匹配当前图片
+ const isUsed = imageRefs.some(ref => {
+ // 处理相对路径和绝对路径
+ const normalizedRef = ref.replace(/^\.\//, '');
+ const fileName = path.basename(ref);
+
+ return (
+ fileName === imageFileName ||
+ normalizedRef.includes(imageFileName) ||
+ ref.includes(imageFileName) ||
+ normalizedRef === imagePath ||
+ ref === imagePath
+ );
+ });
+
+ if (isUsed) {
+ return { used: true, foundIn: correspondingMdFile.fileName };
+ }
+ }
+
+ // 如果在对应的markdown文件中没找到,检查所有其他markdown文件
+ for (const mdFile of allMarkdownFiles) {
+ if (mdFile.blogName === blogName) continue; // 已经检查过了
+
+ const imageRefs = extractImageReferences(mdFile.fullPath);
+ const isUsed = imageRefs.some(ref => {
+ const normalizedRef = ref.replace(/^\.\//, '');
+ const fileName = path.basename(ref);
+
+ return (
+ fileName === imageFileName ||
+ normalizedRef.includes(imageFileName) ||
+ ref.includes(imageFileName)
+ );
+ });
+
+ if (isUsed) {
+ return { used: true, foundIn: mdFile.fileName };
+ }
+ }
+
+ return { used: false, foundIn: null };
+}
+
+// 主函数
+function analyzeUnusedImages() {
+ console.log('🔍 开始分析未使用的图片资源...\n');
+
+ const assetImages = getAllAssetImages();
+ const markdownFiles = getAllMarkdownFiles();
+
+ console.log(`📊 统计信息:`);
+ console.log(` - 找到 ${assetImages.length} 个图片文件`);
+ console.log(` - 找到 ${markdownFiles.length} 个markdown文件\n`);
+
+ const unusedImages = [];
+ const usedImages = [];
+
+ console.log('📝 分析结果:\n');
+
+ assetImages.forEach(image => {
+ const usage = isImageUsed(image.relativePath, image.fileName, image.blogName, markdownFiles);
+
+ if (usage.used) {
+ usedImages.push({
+ ...image,
+ foundIn: usage.foundIn
+ });
+ console.log(`✅ ${image.fileName} (在 ${usage.foundIn} 中使用)`);
+ } else {
+ unusedImages.push(image);
+ console.log(`❌ ${image.fileName} (未使用)`);
+ }
+ });
+
+ // 输出汇总
+ console.log('\n📋 汇总报告:');
+ console.log(` ✅ 已使用的图片: ${usedImages.length} 个`);
+ console.log(` ❌ 未使用的图片: ${unusedImages.length} 个`);
+
+ if (unusedImages.length > 0) {
+ console.log('\n🗑️ 未使用的图片列表:');
+ unusedImages.forEach(image => {
+ console.log(` - ${image.relativePath}`);
+ });
+
+ // 计算未使用图片的总大小
+ let totalSize = 0;
+ unusedImages.forEach(image => {
+ try {
+ const stats = fs.statSync(image.fullPath);
+ totalSize += stats.size;
+ } catch (error) {
+ console.error(`无法获取文件大小: ${image.fullPath}`);
+ }
+ });
+
+ console.log(`\n💾 未使用图片总大小: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);
+
+ // 生成删除脚本(包含git移除操作)
+ const deleteScript = unusedImages.map(image => {
+ return `# 删除文件: ${image.relativePath}
+if [ -f "${image.fullPath}" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "${image.fullPath}" >/dev/null 2>&1; then
+ echo "从git中移除: ${image.relativePath}"
+ git rm "${image.fullPath}"
+ else
+ echo "删除未跟踪文件: ${image.relativePath}"
+ rm "${image.fullPath}"
+ fi
+else
+ echo "文件不存在,跳过: ${image.relativePath}"
+fi`;
+ }).join('\n\n');
+
+ const scriptContent = `#!/bin/bash
+# 删除未使用的图片文件并从git中移除(如果被跟踪)
+# 生成时间: ${new Date().toLocaleString()}
+
+set -e # 遇到错误时退出
+
+echo "🗑️ 开始删除未使用的图片文件..."
+echo "总共需要处理 ${unusedImages.length} 个文件"
+echo ""
+
+${deleteScript}
+
+echo ""
+echo "✅ 删除操作完成!"
+echo "如果有文件从git中移除,请记得提交这些更改:"
+echo "git commit -m 'Remove unused images'"
+`;
+
+ fs.writeFileSync('./delete-unused-images.sh', scriptContent);
+ console.log('\n📜 已生成删除脚本: delete-unused-images.sh');
+ console.log(' 脚本将自动检查文件是否被git跟踪,并相应地删除或从git中移除');
+ console.log(' 运行 chmod +x delete-unused-images.sh && ./delete-unused-images.sh 来删除这些文件');
+ } else {
+ console.log('\n🎉 太棒了!所有图片都在使用中!');
+ }
+}
+
+// 检查是否安装了 glob 包
+try {
+ require('glob');
+} catch (error) {
+ console.error('❌ 缺少依赖包 "glob"');
+ console.log('请运行: npm install glob');
+ process.exit(1);
+}
+
+// 运行分析
+analyzeUnusedImages();
diff --git a/delete-unused-images.sh b/delete-unused-images.sh
new file mode 100755
index 0000000..9995f76
--- /dev/null
+++ b/delete-unused-images.sh
@@ -0,0 +1,308 @@
+#!/bin/bash
+# 删除未使用的图片文件并从git中移除(如果被跟踪)
+# 生成时间: 6/17/2025, 2:07:13 PM
+
+set -e # 遇到错误时退出
+
+echo "🗑️ 开始删除未使用的图片文件..."
+echo "总共需要处理 21 个文件"
+echo ""
+
+# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png
+if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png" >/dev/null 2>&1; then
+ echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
+ git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
+ else
+ echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
+ rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
+ fi
+else
+ echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185355849.png"
+fi
+
+# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png
+if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png" >/dev/null 2>&1; then
+ echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
+ git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
+ else
+ echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
+ rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
+ fi
+else
+ echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185522753.png"
+fi
+
+# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png
+if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png" >/dev/null 2>&1; then
+ echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
+ git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
+ else
+ echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
+ rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
+ fi
+else
+ echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185134888.png"
+fi
+
+# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png
+if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png" >/dev/null 2>&1; then
+ echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
+ git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
+ else
+ echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
+ rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
+ fi
+else
+ echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185450325.png"
+fi
+
+# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png
+if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png" >/dev/null 2>&1; then
+ echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
+ git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
+ else
+ echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
+ rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
+ fi
+else
+ echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185437222.png"
+fi
+
+# 删除文件: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png
+if [ -f "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png" >/dev/null 2>&1; then
+ echo "从git中移除: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
+ git rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
+ else
+ echo "删除未跟踪文件: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
+ rm "src/blogs/ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
+ fi
+else
+ echo "文件不存在,跳过: ESP8266天气时钟——项目展示.assets/image-20250418185235222.png"
+fi
+
+# 删除文件: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png
+if [ -f "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png" >/dev/null 2>&1; then
+ echo "从git中移除: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
+ git rm "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
+ else
+ echo "删除未跟踪文件: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
+ rm "src/blogs/基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
+ fi
+else
+ echo "文件不存在,跳过: 基于CV的单摆实验优化方案实验进度与总结.assets/image-20250419023105897.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183938916.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615210657893.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184000111.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184041925.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162729822.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615162905319.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183916297.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180243855.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183930318.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615180250839.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105.jpg"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615183815955.png"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/WechatIMG105-9994965.jpg"
+fi
+
+# 删除文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png
+if [ -f "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png" ]; then
+ # 检查文件是否被git跟踪
+ if git ls-files --error-unmatch "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png" >/dev/null 2>&1; then
+ echo "从git中移除: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
+ git rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
+ else
+ echo "删除未跟踪文件: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
+ rm "src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
+ fi
+else
+ echo "文件不存在,跳过: AI 视觉驱动的智慧物理实验全过程教学平台.assets/image-20250615184008960.png"
+fi
+
+echo ""
+echo "✅ 删除操作完成!"
+echo "如果有文件从git中移除,请记得提交这些更改:"
+echo "git commit -m 'Remove unused images'"
diff --git a/src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.md b/src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.md
index 126108a..c309bc6 100644
--- a/src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.md
+++ b/src/blogs/AI 视觉驱动的智慧物理实验全过程教学平台.md
@@ -28,11 +28,11 @@ tags: AI、物理、教育、竞赛
**计算机视觉(CV)模块**主要承担物理现象的“感知者”角色。无论是力学实验中物体的运动轨迹、速度、加速度,还是未来可能拓展的光学条纹、热学形变等,CV技术都能通过图像序列分析,将宏观或微观的物理过程转化为精确的数字信号。例如,在单摆实验中,利用Hough变换、轮廓检测或更先进的目标跟踪算法(如基于深度学习的YOLO系列进行特定标记物跟踪)实时定位摆球中心,其精度远超手动计时和肉眼估读。对于电路实验,CV则用于识别实物电路板上的元件种类、参数及连接关系。
-
+
+
+
+
+
+ 
+ 
+ 
-
+
+
+ 
+
+
+ 
+```mermaid
+graph LR
+ A[用户拍摄真实电路照片] --> AI_Module;
+ subgraph AI_Module [AI电路识别与转换模块]
+ E{AI元件识别 YOLOv8};
+ E --> F[识别结果: 元件, 位置];
+ F --> G{AI连接关系分析};
+ G --> I[生成电路拓扑数据 JSON];
+ end
+
+ I --> J[浏览器中复现可交互虚拟电路];
+```

