从图像到数据:HaoCurve曲线提取实战与避坑指南

简介:HaoCurve(薅曲线)是一套面向科研人员、工程师与数据分析者的MATLAB曲线绘制工具源码,适合需要在MATLAB环境中快速生成、编辑和分析数据曲线图的用户,尤其对希望深入理解绘图脚本实现、进行二次开发的进阶使用者更有参考价值。资源包共3个文件,包含1个m脚本、1个mat数据文件和1个p文件,压缩包约161KB,其中m文件承担曲线绘制与参数调用的核心逻辑,mat文件用于存放示例数据,p文件则可能为预编译的辅助函数,整体结构精简、便于直接导入运行。目前已有1602人学习下载,说明其在数据可视化场景中具有一定认可度。借助这份源码,读者可以了解曲线颜色、线型、标记样式及坐标轴范围、刻度、标签等视觉属性的定制方式,掌握图例、标题、网格线等增强图形可读性的实现思路,并在此基础上按自身需求修改脚本、扩展新功能,从而更高效地展示复杂数据关系。

1. 薅曲线到底在薅什么:从一条手绘曲线到可复现代码

很多人第一次看到“薅曲线”这个词,以为是某种自动化脚本或者爬虫工具,其实它解决的是一个非常具体的工程问题:如何把一张图片里的曲线,快速、准确地还原成可计算、可编辑、可复用的数值数据。你手里可能有一张论文截图、一份扫描版实验报告、一张示波器屏幕照片,上面画着一条或几条曲线,但你没有原始数据。重新做实验成本太高,找作者要数据不现实,手动描点又慢又容易出错。HaoCurve 这类工具的核心价值,就是把“看图”变成“取数”,把像素坐标映射回物理坐标,最终输出一份能直接丢进 Excel、Python 或 MATLAB 里继续处理的数值表。

它适合谁?做实验数据分析的研究生、需要复现别人图表结果的一线工程师、经常处理历史数据档案的技术人员,以及任何需要从静态图像中提取定量信息的人。你不需要精通图像处理,但需要理解一个基本前提:曲线提取的精度,取决于你对坐标轴和图像质量的控制,而不是工具本身有多智能。这篇笔记会从最小可复现流程讲起,把参数怎么调、坑在哪里、什么情况下该放弃自动提取改用半自动,全部拆开说清楚。

2. 从像素到数值:HaoCurve 的坐标映射逻辑与最小跑通流程

2.1 为什么不能直接“点两个点就完事”

很多人以为曲线提取就是“点一下左上角,点一下右下角,然后自动识别曲线”。这个思路在理想情况下成立,但实际图像里充满了干扰:坐标轴刻度线、网格线、图例、文字标注、曲线交叉、颜色渐变、压缩伪影。HaoCurve 的底层逻辑通常分三步:图像预处理 → 坐标轴标定 → 曲线像素追踪与映射。预处理负责把彩色图转灰度、二值化、去噪;坐标轴标定负责建立像素坐标与物理坐标的仿射变换关系;曲线追踪负责从二值图中分离出属于曲线的像素,并按列或按行扫描得到中心点。

这里的关键参数是二值化阈值和坐标轴标定点数量。阈值设高了,浅色曲线会断;设低了,背景噪声会被当成曲线。标定点只选两个角点,在图像有透视畸变或非线性缩放时会产生系统性误差。常见做法是至少选四个点:X 轴两个刻度、Y 轴两个刻度,用最小二乘法拟合映射关系。

2.2 用 Python 复现 HaoCurve 的核心步骤

下面这段代码不依赖任何特定 GUI 工具,直接用 OpenCV 和 NumPy 实现从图像到数值的最小闭环。你可以把它当成 HaoCurve 类工具的“手动挡”版本,理解每一步在做什么。

import cv2 import numpy as np # 1. 读取图像并转灰度 img = cv2.imread("curve.png") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 二值化:阈值需要根据图像对比度调整 # 如果曲线是深色、背景是浅色,用 THRESH_BINARY_INV _, binary = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV) # 3. 坐标轴标定:假设你已知四个参考点的像素坐标和物理坐标 # 像素坐标 (px, py) 从图像上读取,物理坐标 (x, y) 从刻度标签读取 pixel_points = np.array([[50, 400], [550, 400], [50, 50], [550, 50]], dtype=np.float32) physical_points = np.array([[0, 0], [10, 0], [0, 5], [10, 5]], dtype=np.float32) # 4. 计算仿射变换矩阵(这里用透视变换,适应更多场景) M = cv2.getPerspectiveTransform(pixel_points, physical_points) # 5. 提取曲线像素:按列扫描,取每列中二值化后白色像素的均值位置 height, width = binary.shape curve_points = [] for col in range(width): rows = np.where(binary[:, col] > 0)[0] if len(rows) > 0: # 取中位数比均值更抗噪 row_center = int(np.median(rows)) curve_points.append((col, row_center)) # 6. 将像素坐标映射到物理坐标 curve_pixels = np.array(curve_points, dtype=np.float32).reshape(-1, 1, 2) curve_physical = cv2.perspectiveTransform(curve_pixels, M).reshape(-1, 2) # 7. 按 X 物理坐标排序并输出 curve_physical = curve_physical[np.argsort(curve_physical[:, 0])] np.savetxt("curve_data.csv", curve_physical, delimiter=",", header="x,y", comments="")

这段代码的逻辑说明:第一步转灰度是为了降低计算维度;第二步二值化把曲线从背景中分离出来,阈值 120 是经验值,实际需要根据图像直方图调整;第三步的四个标定点必须覆盖整个坐标轴范围,不能只选局部;第四步用透视变换而不是简单线性缩放,是因为拍照或扫描图像往往存在梯形畸变;第五步按列扫描取中位数,比取均值更能抵抗孤立噪声点;第六步把像素坐标批量映射到物理坐标;第七步排序后保存为 CSV。

参数调整建议:如果曲线有断裂,降低阈值或先做形态学闭运算;如果背景噪声多,提高阈值或先做高斯模糊;如果曲线是彩色的而背景是灰白的,可以转到 HSV 空间按颜色通道提取,比灰度二值化更干净。

2.3 标定点的选择比算法本身更重要

我见过太多人把时间花在换算法、调参数上,结果标定点选错了,整条曲线整体偏移。标定点的选取原则只有一条:选你确定知道物理坐标的、清晰的、孤立的点。坐标轴上的刻度线交叉点是最佳选择,不要选文字标注的中心,不要选网格线的交点(除非你能确认网格线对应的物理值)。如果图像有旋转,至少选三个不共线的点;如果有透视畸变,选四个角点。标定完成后,一定要用已知点做验证:比如取一个刻度点,看映射后的物理坐标是否等于标签值,误差超过 1% 就要重新选点。

3. 参数怎么设:二值化、扫描方向与平滑策略的取舍

3.1 二值化阈值:自适应比固定值更稳

固定阈值在光照均匀的扫描件上表现很好,但遇到拍照图像、屏幕截图、老旧文档,全局阈值就会翻车。常见做法是改用自适应阈值或 Otsu 方法。Otsu 适合双峰直方图的图像,自适应阈值适合光照不均的场景。下面这段代码展示了三种方式的对比。

# 全局固定阈值 _, binary_fixed = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV) # Otsu 自动阈值 _, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 自适应阈值:适合光照不均 binary_adaptive = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 31, 10 )

逻辑说明:Otsu 方法会遍历所有可能阈值,找到使类间方差最大的那个值,适合背景和前景对比明显的图。自适应阈值对每个像素邻域单独计算阈值,邻域大小 31 和常数 10 需要根据图像分辨率调整——分辨率越高,邻域越大。如果曲线本身有粗细变化,自适应阈值可能会把粗的地方内部挖空,这时候需要先做闭运算填充。

3.2 扫描方向:按列还是按行,取决于曲线单调性

按列扫描适合 X 轴单调递增的曲线,比如时间序列、频率响应。按行扫描适合 Y 轴单调的曲线,比如深度剖面。如果曲线有回环、自交、垂直段,单一方向扫描会丢失信息。这时候需要改用轮廓追踪或骨架化方法。常见做法是先用cv2.findContours找到所有连通区域,再根据面积和长宽比筛选出曲线轮廓,最后用cv2.ximgproc.thinning做骨架化,得到单像素宽度的曲线。

参数上,轮廓筛选的面积阈值建议设为图像总像素的 0.1% 到 1% 之间,太小会把噪声当曲线,太大会把断裂的曲线段丢掉。骨架化之后,按列扫描取中位数依然适用,但要注意骨架化可能会在交叉点产生分支,需要做剪枝。

3.3 平滑策略:什么时候该平滑,什么时候不该

提取出来的原始数据往往有锯齿,这是像素离散化的必然结果。平滑能改善视觉效果,但会引入偏差。我的经验是:如果后续要做微分或峰值检测,不要平滑;如果只是做趋势展示,可以用 Savitzky-Golay 滤波。移动平均会把峰值削平,高斯滤波会改变峰位,Savitzky-Golay 在保留峰形方面表现更好。窗口长度建议取曲线总点数的 1% 到 3%,多项式阶数取 2 或 3。平滑前先保存一份原始数据,这是后悔药。

4. 避坑与排查:曲线提取翻车的五个典型场景

4.1 曲线断裂成多段,提取结果跳变

现象:输出的 CSV 里 X 坐标不连续,中间缺了一段,或者 Y 值突然跳到另一个位置。原因:二值化阈值过高,浅色曲线段被当成背景;或者曲线被坐标轴、网格线切断。解决:降低阈值,或者先做形态学闭运算把断口连上。如果曲线被网格线切断,可以先用霍夫线检测找出网格线并擦除,再提取曲线。擦除网格线时注意不要擦到曲线本身,可以用颜色区分——网格线通常是灰色,曲线是彩色或深色。

4.2 坐标轴标定后整体偏移

现象:提取的曲线形状对,但所有数值整体偏大或偏小。原因:标定点选在了刻度线的边缘而不是中心,或者标定点的物理坐标读错了。解决:放大图像,把标定点选在刻度线中心;物理坐标要读刻度标签,不要自己估算。标定完成后,用另一个已知刻度点做验证,误差超过 1% 就重新标定。如果图像有透视畸变,四个标定点要尽量分散在图像四角,不要集中在某一侧。

4.3 多条曲线混在一起无法分离

现象:图中有多条曲线,提取结果把几条线连成了一条。原因:二值化后所有曲线都是白色,按列扫描时取了所有白色像素的中位数,导致结果落在几条曲线中间。解决:按颜色分离。如果曲线颜色不同,转到 HSV 空间,对每种颜色单独做掩膜。如果曲线颜色相同但线型不同(实线、虚线),可以先用形态学操作区分——实线连通域大,虚线连通域小。如果都不行,只能手动框选每条曲线的区域,分区域提取。

4.4 图像分辨率太低导致精度不够

现象:提取的曲线阶梯感明显,相邻点之间跳变很大。原因:图像分辨率不足,一个像素对应的物理量太大。解决:如果可能,重新获取更高分辨率的图像。如果不行,可以用插值方法在像素之间估算,但要注意插值不会增加真实信息,只是让曲线看起来平滑。更诚实的做法是在输出数据里保留原始像素精度,并在文档里注明“每个像素对应 X 物理单位”。一般来说,曲线提取的相对误差不应低于图像中曲线线宽的一半。

4.5 输出数据在 Excel 里打开乱码或错列

现象:CSV 文件用 Excel 打开后,所有数据挤在一列,或者中文注释变成乱码。原因:分隔符不匹配或编码问题。解决:保存时用delimiter=','并指定encoding='utf-8-sig',这样 Excel 能正确识别 UTF-8 编码。如果还是错列,检查数据里是否有逗号被当成了分隔符——物理坐标通常不会,但如果你在 header 里写了中文逗号就会出问题。最稳妥的方式是保存为.xlsx格式,用 openpyxl 或 pandas 直接写。

5. 进阶技巧:批量处理与精度验证的实操方法

5.1 批量处理同格式图像的脚本框架

如果你有几十张同类型的曲线图,每张都手动标定会疯掉。批量处理的前提是图像格式高度一致:坐标轴位置固定、刻度范围相同、曲线颜色一致。这种情况下可以把标定点写成配置文件,循环读取图像并套用同一套参数。下面是一个批量处理的骨架代码。

import os import cv2 import numpy as np import pandas as pd # 配置:所有图像共用的标定点和阈值 CONFIG = { "pixel_points": [[50, 400], [550, 400], [50, 50], [550, 50]], "physical_points": [[0, 0], [10, 0], [0, 5], [10, 5]], "threshold": 120, "output_dir": "output" } os.makedirs(CONFIG["output_dir"], exist_ok=True) M = cv2.getPerspectiveTransform( np.array(CONFIG["pixel_points"], dtype=np.float32), np.array(CONFIG["physical_points"], dtype=np.float32) ) for fname in os.listdir("images"): if not fname.lower().endswith((".png", ".jpg", ".jpeg")): continue img = cv2.imread(os.path.join("images", fname)) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, CONFIG["threshold"], 255, cv2.THRESH_BINARY_INV) points = [] for col in range(binary.shape[1]): rows = np.where(binary[:, col] > 0)[0] if len(rows) > 0: points.append((col, int(np.median(rows)))) if not points: print(f"{fname}: 未检测到曲线,跳过") continue pixels = np.array(points, dtype=np.float32).reshape(-1, 1, 2) physical = cv2.perspectiveTransform(pixels, M).reshape(-1, 2) physical = physical[np.argsort(physical[:, 0])] df = pd.DataFrame(physical, columns=["x", "y"]) out_path = os.path.join(CONFIG["output_dir"], fname.rsplit(".", 1)[0] + ".csv") df.to_csv(out_path, index=False, encoding="utf-8-sig") print(f"{fname}: 输出 {len(df)} 个点")

这段代码的关键在于配置与数据分离。标定点和阈值写在 CONFIG 里,换一批图只需要改配置。实际使用中,建议先拿一张图跑通,确认输出正确后再批量跑。批量跑的时候要加异常捕获,某张图失败不应该中断整个流程。输出文件名保持和输入一致,方便追溯。

5.2 精度验证:用已知曲线做闭环测试

你怎么知道提取结果是准的?最可靠的方法是自己生成一张测试图:用代码画一条已知函数的曲线,保存为图片,再用提取脚本跑一遍,对比提取结果和原始函数。下面是一个闭环测试的例子。

import numpy as np import matplotlib.pyplot as plt # 生成已知曲线:y = sin(x) + 0.1x x_true = np.linspace(0, 10, 500) y_true = np.sin(x_true) + 0.1 * x_true # 画图并保存,不显示坐标轴标签和刻度,模拟干净图像 fig, ax = plt.subplots(figsize=(6, 4), dpi=100) ax.plot(x_true, y_true, "k-", linewidth=2) ax.set_xlim(0, 10) ax.set_ylim(-1.5, 2.5) ax.axis("off") # 关闭坐标轴,方便后续手动标定 plt.savefig("test_curve.png", bbox_inches="tight", pad_inches=0) plt.close() # 然后用前面的提取脚本处理 test_curve.png # 标定点需要根据实际图像像素位置手动读取 # 对比提取结果和 y_true,计算均方根误差

这个测试的意义在于:你能精确知道每个 X 对应的真实 Y 值,提取误差一目了然。如果均方根误差在可接受范围内(比如小于曲线幅度的 1%),说明整个流程是可靠的。如果误差大,逐步排查是二值化问题、标定问题还是扫描方向问题。我一般会把这个测试图跑三遍:原图、加高斯噪声、加 JPEG 压缩,看看算法在退化条件下的表现。这样你心里就有底了,知道什么质量的图能接,什么质量的图该拒。

5.3 一个容易被忽略的细节:曲线线宽的影响

曲线在图像里是有宽度的,按列扫描取中位数得到的是线宽中心。如果线宽是 3 个像素,中心点的误差最多 1.5 个像素。在标定精度高的情况下,这个误差可以接受。但如果线宽是 10 个像素,误差就大了。这时候需要做亚像素级中心提取,常见做法是对每列的灰度分布做高斯拟合,取拟合峰值位置。OpenCV 没有直接提供这个功能,需要自己写。我的习惯是:线宽小于 5 像素用中位数,大于 5 像素用灰度加权重心。灰度加权重心的公式是sum(y * I(y)) / sum(I(y)),其中 I(y) 是灰度值。这个方法比中位数更抗噪,但要求曲线和背景的对比度足够高。

最后说一个我自己的教训:早期做曲线提取时,我总想把所有参数都自动化,结果在异常图像上反复翻车。后来我改成“自动提取 + 人工抽检”的模式,每批数据随机抽 10% 用肉眼对比原图,发现偏差就回退到半自动模式。这个习惯帮我省了很多返工时间。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

CLI编码代理失败过程解剖:从轨迹日志到根因分析

CLI编码代理失败过程解剖:从轨迹日志到根因分析

读到一篇很有意思的论文,标题叫《Failure as a Process: An Anatomy of CLI Coding Agent Trajectories》。这两年命令行AI编程工具越来越多,从最初的“能写一段函数”到现在能在真实仓库里自己定位问题、改代码、跑测试,甚至提交补丁。但大多…

2026/10/20 20:43:28 阅读更多 →
小橘子V4.790:本地可调试塔防策略模拟器

小橘子V4.790:本地可调试塔防策略模拟器

简介:本资源是《向僵尸开炮》游戏的自动化对局辅助工具——小橘子V4.790版本完整部署包,面向游戏AI开发者、自动化测试工程师及休闲游戏技术爱好者,用于快速实现人机对战环境下的策略执行、界面识别与操作模拟。压缩包共741个文件&#xff0c…

2026/10/20 20:42:25 阅读更多 →
Win11访问Win7共享报错0x80070035?SMB协议与网络配置修复指南

Win11访问Win7共享报错0x80070035?SMB协议与网络配置修复指南

1. 0x80070035 到底是什么:先搞清楚报错在哪里先把结论说在前面:这个错误码的意思是“找不到网络路径”。很多朋友升到 Win11 之后,双击网络里那台老 Win7 电脑的共享文件夹,直接弹一个红叉,错误码 0x80070035&#xf…

2026/10/20 20:42:24 阅读更多 →

最新新闻

手写鼠标点击粒子特效:从原理到性能优化的完整实战

手写鼠标点击粒子特效:从原理到性能优化的完整实战

前阵子给某活动页面做氛围优化,需求方反复强调要有“互动感”。白底、黑字、产品图,排版再干净,鼠标移上去没有任何反馈,也确实容易让人产生“这是个静态PPT”的错觉。于是我想到了“鼠标粒子特效”——准确说,是一段H…

2026/10/20 21:16:52 阅读更多 →
Java实现IP归属地查询:离线库方案与Spring Boot封装实践

Java实现IP归属地查询:离线库方案与Spring Boot封装实践

在做日志分析和用户画像时,后端服务拿到一个公网IP,最朴素的需求就是想知道这个IP到底来自哪个省、哪个市,甚至哪个运营商。这个需求听起来不难,网上搜“Java IP归属地查询”会跳出一堆在线API,复制一段代码就能跑通&a…

2026/10/20 21:16:52 阅读更多 →
基于SpringBoot和微信小程序的考研学习系统开发实战

基于SpringBoot和微信小程序的考研学习系统开发实战

先说结论:这套“基于微信小程序的考研学习系统”,选题方向是对的,技术栈也不冷门。后端SpringBoot、前端微信原生小程序,功能覆盖学习计划、每日打卡、题库刷题、错题本、学习统计和后台管理。作为计算机毕业设计,它兼…

2026/10/20 21:16:52 阅读更多 →
context-mode上下文模式设计:从状态机建模到工程落地的完整实践

context-mode上下文模式设计:从状态机建模到工程落地的完整实践

1. 从“上下文模式”这个命名说起:它到底在解决什么问题第一次看到“context-mode”这个词,很多人会下意识地把它当成某个框架里的配置项,或者某个编辑器插件的开关。但如果你真的在工程一线待过几年,就会发现这个词背后藏着一个非…

2026/10/20 21:16:52 阅读更多 →
STM32F103裸机驱动两相四线步进电机:时序精度与IO翻转控制实战

STM32F103裸机驱动两相四线步进电机:时序精度与IO翻转控制实战

简介:本资源是一套基于STM32F103微控制器的两相四线步进电机驱动程序,面向嵌入式初学者、电机控制实践者及自动化设备开发工程师,解决步进电机精准启停、方向切换与细分控制等核心问题,适用于3D打印机、CNC小车、精密位移平台等需…

2026/10/20 21:16:52 阅读更多 →
Java+Selenium自动化测试入门:核心机制与工程实践全解析

Java+Selenium自动化测试入门:核心机制与工程实践全解析

1. 项目概述:JavaSelenium到底在解决什么问题说实话,Selenium这个框架我已经用了快十年,从最早的Selenium IDE到现在的WebDriver 4.x,踩过的坑能装满一个仓库。这些年有很多新手问我同一个问题:"JavaSelenium到底…

2026/10/20 21:15:44 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →