不依赖深度学习:用傅里叶算子实现手势识别的完整方案
简介这是一套面向手势识别方向学习者和研究者提供的完整 Python 工程代码以傅里叶算子为技术主线覆盖了从图像采集到轮廓特征提取、模型训练与界面展示的闭环流程。压缩包内共包含 2000 个文件以 png 图像样本、txt 数据、py 源码及 m 模型文件为主整体大小约 142.52 MB。代码基于 Win10 Python 3.7 实现详细展示了图像平滑、基于 OTSU 阈值的肤色分割、八邻域搜索法的轮廓检测并针对轮廓曲线分别提取傅里叶描述子与椭圆傅里叶描述子后完成归一化同时利用 KNN 与 SVM 两种算法在自建样本库上完成训练附有 PyQt5 简易交互界面便于直观测试识别效果。目前已有 13865 人学习/下载适合希望深入理解传统机器学习在手势识别中的应用或需要快速搭建手势识别实验系统的开发者参考使用。1. 傅里叶算子的手势识别是什么一个不依赖深度学习框架的可行方案傅里叶算子的手势识别听起来像论文标题落地其实是一套能跑的 Python 工程把每张手势图当成二维矩阵用傅里叶变换把形状特征搬到频域去比较再靠样本库做模板匹配。它不依赖机器学习框架适合作业、原型和小数据集验证。我做过一版数字手势 0—9 的识别样本库负责采集和归一化傅里叶算子负责提取特征分类器做最近邻比对。整条链路只用 NumPy 和 OpenCV从预处理到出结果代码在一千行上下换到别的形状识别任务只需改数据加载部分。下文把原理、代码结构、参数选择和容易翻车的地方一次说清。照这篇跑一遍你会拿到一条能采集、能建库、能实时识别的完整链路而不是只看到一个孤立公式。2. 算子与特征设计为什么用频域带通而不是直接比幅度谱2.1 两种常见打开方式轮廓傅里叶描述子与图像频域特征傅里叶算子做手势识别从业者常用两条路线。一条是轮廓傅里叶描述子对手的轮廓点序列做离散傅里叶变换取前几十个系数当形状特征。这条路线适合背景干净、轮廓稳定的场景手指张开程度变化大时系数变化也大区分度不错但一旦出现遮挡或者轮廓提取断点描述子就整体失稳。另一条是图像频域特征把整张手势图做二维 FFT得到幅度谱再用方向带通掩码刻画出各个朝向的结构能量。这条路线对局部形变宽容背景有轻度噪声时也更扛得住。我做手势识别时选这条主要原因是样本库采集条件不可能每次都一致换摄像头、换光线是常态轮廓法太容易碎。两边的取舍用表格看更清楚。方案适用对象优点短板轮廓傅里叶描述子轮廓干净的单目标特征维数低旋转不变性好实现抗遮挡差轮廓断裂就失效频域带通 分块能量整幅二值图或灰度图对形变宽容方向信息完整参数多需要归一化2.2 最小 Python 实现Gabor 方向带通与分块能量特征选定路线后特征提取可以压缩成两个函数。第一步构造频域里的方向带通掩码形状上相当于一对蝴蝶翅膀只放行某个朝向附近的频谱分量第二步把图像频谱和掩码相乘再分块聚合能量。import numpy as np import cv2 def gabor_bandpass(size128, theta0.0, center_rho0.18, bandwidth0.3): 频域方向带通掩码size 必须和频谱尺寸一致。 theta 的方向角只取 [0, pi)因为实数图像的幅度谱是中心对称的。 yy, xx np.indices((size, size)) - size // 2 rho np.sqrt(xx ** 2 yy ** 2) / size # 归一化径向频率 phi np.arctan2(yy, xx) # 方向差按周期取最小夹角避免 0 度和 180 度被当成两个方向 angle_diff np.abs(phi - theta) angle_diff np.minimum(angle_diff, np.pi - angle_diff) radial np.exp(-0.5 * ((rho - center_rho) / bandwidth) ** 2) angular np.exp(-0.5 * (angle_diff / (0.4 * bandwidth)) ** 2) return radial * angular def fourier_gesture_feature(gray, k_directions8, block_size4): 输入: 任意尺寸的灰度图函数内部会缩放到 128x128。 输出: k_directions * block_size * block_size 维特征向量。 gray cv2.resize(gray, (128, 128)).astype(np.float64) # fftshift 把零频挪到中心后续掩码和可视化都按中心坐标理解 spectrum np.fft.fftshift(np.fft.fft2(gray)) amp np.log1p(np.abs(spectrum)) # 压缩动态范围 amp (amp - amp.mean()) / (amp.std() 1e-8) # 每个样本自己做标准化 feats [] for k in range(k_directions): theta k * np.pi / k_directions mask gabor_bandpass(thetatheta) filtered amp * mask # 乘性带通不涉及卷积 # 4x4 分块求能量均值把位置信息压缩成粗粒度布局 ph pw 128 // block_size blocks filtered[:ph * block_size, :pw * block_size] blocks blocks.reshape(block_size, ph, block_size, pw) blocks blocks.mean(axis(1, 3)) feats.append(blocks.ravel()) return np.concatenate(feats)代码逻辑不复杂np.fft.fft2拿到整幅图的频谱fftshift之后零频在正中心所有掩码都按中心坐标构造避免把低频堆在四个角落造成理解和调试困难。np.log1p是对幅度谱取对数这个操作很关键否则频谱里少数几个强亮点会把其余信息全部压扁特征向量约等于噪声。标准化那句(amp - amp.mean()) / amp.std()是每个样本内部做的用来抵消整体亮度差异。参数里最需要注意的是k_directions。实数图像的幅度谱中心对称方向只需要覆盖 0 到 180 度所以 8 个方向实际是在半圆上均匀取 8 个朝向。block_size4表示每个方向最后聚合为 4×4 的能量块8 个方向拼起来就是 128 维向量。这个维数对小样本库很合适降到 16 维会损失频率布局信息提到 32×32 分块则容易过拟合采集时的设备噪声。2.3 参数怎么设一张表和三个检查点特征提取参数看着多其实只有五个遵循常见的起点值即可。我一般按下面这张表初始化再根据识别结果微调。参数推荐起点取值偏了会怎样sigma / bandwidth0.25 到 0.35太小方向选择性过强手稍微转动就匹配不上太大方向信息糊成一团center_rho0.16 到 0.20偏小抓整体轮廓偏大抓指尖高频细节都对但需要匹配你的图像分辨率k_directions8少于 6 丢失方向区分度多于 12 对旋转过于敏感block_size4越大特征维数越高样本不够时容易假阳性输入尺寸128 x 128过小轮廓细节丢失过大频谱里高频噪声占比上升调参时先看三个检查点比盲目试网格快。第一把fftshift后的频谱用cv2.imshow看一眼确认亮斑在中心如果亮斑偏到角落说明输入图里有强边缘或未做去均值特征会整体漂移。第二对几个不同手势打印每个方向的平均能量正常情况是不同手势能量分布有明显差异如果八个方向差不多说明center_rho取太高谱上只剩噪声在起作用。第三把首位最近邻和第二近邻的距离比值打出来如果经常接近 1说明特征可分性差优先调方向数而不是盲目堆样本。3. 完整工程落地从采集样本到单张识别3.1 目录即标签样本库的结构与源代码管理样本库的物理组织方式直接决定后面代码的复杂度。常见的做法是目录名即标签每个类别一个文件夹文件就是归一化后的灰度图。这样做的好处是样本库可以直观地放进源代码管理新增一类手势就是新增一个目录采集一批新样本就是一次提交历史可追溯别人接手也不用猜二进制格式。fourier_gesture/ ├── samples/ │ ├── train/ │ │ ├── 0/0001.png │ │ ├── 1/0001.png │ │ └── ... │ └── val/ ├── feature_extract.py ├── build_database.py ├── recognize.py └── requirements.txt环境只需要三件套是 Python 项目里最省事的安装方式pip install numpy opencv-python scipy。scipy 在最小版本里只用到了scipy.signal.fftconvolve如果你确定不会碰空域卷积去掉它也能跑。我自己做原型时每类先采 30 到 50 张覆盖不同手型和轻微旋转验证阶段再补。样本不是越多越好关键是覆盖度张开、握拳、半握、手指并拢和分开都要有否则最近邻匹配会在你没见过的中间形态上乱跳。3.2 采集与归一化把摄像头画面变成 128×128 灰度样本采集样本是整条链路里第一个容易翻车的环节。直接截取原始帧会让特征里混入背景纹理、桌面反光和袖子边缘后面的频域算子再强也救不回来。我常用的采集函数是这样的import os import time import cv2 import numpy as np def acquire_hand_sample(frame, label): # 1. YCrCb 肤色粗分割Cr 范围针对常见室内光源 ycrcb cv2.cvtColor(frame, cv2.COLOR_BGR2YCrCb) mask cv2.inRange(ycrcb, (0, 133, 77), (255, 173, 127)) # 2. 开运算去掉小噪点保留最大连通域 mask cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((5, 5), np.uint8)) contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if not contours: return None hand max(contours, keycv2.contourArea) # 3. 按外接矩形裁剪再放到正方形画布中央 x, y, w, h cv2.boundingRect(hand) roi mask[y:y h, x:x w] side max(w, h) 40 canvas np.zeros((side, side), np.uint8) ox, oy (side - w) // 2, (side - h) // 2 canvas[oy:oy h, ox:ox w] roi # 4. 统一尺寸保存文件名带毫秒时间戳防止互相覆盖 out cv2.resize(canvas, (128, 128)) cls_dir os.path.join(samples/train, str(label)) os.makedirs(cls_dir, exist_okTrue) path os.path.join(cls_dir, f{time.time():.3f}.png) cv2.imwrite(path, out) return out函数里最值得注意的一步是“外接矩形加 40 像素再居中”。如果不留白手碰到图像边缘时轮廓会被裁开fft 之后频谱沿边缘出现一条十字亮线特征里就混进了“手离边缘多少像素”这种无关信息。把目标放到正方形中央相当于把位置信息抹掉让分类器只学形状。统一cv2.resize(128, 128)是必须的傅里叶算子的频率含义依赖图像尺寸一致测试时尺寸不同center_rho的语义就变了。这里的肤色阈值(0, 133, 77)到(255, 173, 127)是室内常见光线的起点值很粗糙晚上或者暖色灯光下就需要调整这个我在第四章专门说。3.3 构建特征库与识别三个函数串起主流程样本库建好后特征是离线预计算的。不能每次识别都重新对全部样本做一遍 FFT那样实时性不够也没必要。构建时把每个样本过一遍特征提取存成 npz 文件识别时只加载特征矩阵做距离计算。import os import cv2 import numpy as np from feature_extract import fourier_gesture_feature def load_sample_library(rootsamples/train): 目录名即标签返回特征矩阵、标签数组和类别名单。 classes sorted(os.listdir(root)) features, labels [], [] for cls in classes: cls_dir os.path.join(root, cls) for name in sorted(os.listdir(cls_dir)): gray cv2.imread(os.path.join(cls_dir, name), cv2.IMREAD_GRAYSCALE) if gray is None: continue features.append(fourier_gesture_feature(gray)) labels.append(int(cls)) return np.array(features), np.array(labels), classes def build_database(samples_dirsamples/train, out_pathhand_db.npz): 特征做去均值加 L2 归一化后落盘。 X, y, classes load_sample_library(samples_dir) mean X.mean(axis0) X X - mean norm np.linalg.norm(X, axis1, keepdimsTrue) X X / (norm 1e-8) np.savez(out_path, featuresX, labelsy, meanmean, classesclasses) print(fsaved {len(y)} samples - {out_path})load_sample_library不做任何处理只负责读图、提特征、打标签。build_database里做了两个标准化操作减去全体均值再按样本长度归一。减均值本质上是把训练集里“所有手势共有的那部分结构”抠掉剩下的是各类之间的差异L2 归一化则让距离度量变成余弦相似度对整体亮度和对比度变化不敏感。这两个操作对傅里叶特征特别重要因为不同光线下的幅度谱数值范围差异明显。识别侧同样封装成一个函数返回预测标签和一个粗糙的置信度。def recognize_from_file(image_path, db_pathhand_db.npz): data np.load(db_path) feat fourier_gesture_feature(cv2.imread(image_path, 0)) feat feat - data[mean] feat feat / (np.linalg.norm(feat) 1e-8) # 特征库已经是单位向量L2 距离越小越相似 dist np.linalg.norm(data[features] - feat, axis1) top np.argsort(dist)[:2] label int(data[labels][top[0]]) conf 1.0 - dist[top[0]] / (dist[top[0]] dist[top[1]] 1e-8) return label, conf置信度公式的原理很朴素如果第一近邻和第二近邻距离差不多说明特征库里有多个类别都能解释当前输入模型自己是犹豫的置信度会掉到 0.5 附近如果第一近邻明显更近置信度接近 1。实时视频里每帧调用一次这个函数再配合一个连续帧判断就能做防抖这个放第五章讲。工程跑通只需要两条命令python build_database.py建库python recognize.py --image test.png识别单张。如果想把实时摄像头接上来在循环里对cap.read()的每一帧做 3.2 的归一化再调recognize_from_file的等价计算即可特征提取部分完全不用改。4. 避坑与排查手势识别最容易翻车的五个现场4.1 光照与肤色阈值采集环境一变就失灵第一个坑是肤色阈值失效。现象白天同一套 Cr 阈值采集的样本晚上拿到灯光偏暖的房间里识别识别率掉到一半以下指尖区域大片被误判成背景。原因YCrCb 的 Cr 范围对色温和亮度都很敏感暖光灯下肤色 Cr 值整体漂移固定的inRange阈值等于把颜色标准定死在采集那一刻。解决不要只调 Cr 上下限而是先对 Y 通道做个判断暗部像素先排除掉再把 Cr 范围放宽二十个单位之后用形态学开运算把背景噪点清掉。放宽阈值最直接的副作用是背景里偏红的物体混进来所以必须配合“只保留面积最大连通域”这一步。第二个坑紧跟着来。现象手部的细碎反光或者指尖脱皮区域让掩码出现小洞轮廓外接矩形突然放大质心偏离样本图和测试图的归一化不一致。原因二值化后的掩码没有做空洞填充cv2.findContours找到的最大轮廓是外围轮廓一旦边缘有缺口外接矩形就跨到了背景上。解决在MORPH_OPEN之后补一次cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.ones((5,5), np.uint8))先闭后开把指尖和掌心的空洞先填掉再清噪点。顺序不能反过来先开会把本不连通的区域彻底断开。4.2 频域的隐性错误循环卷积与特征自洽性第三个坑是关于 FFT 本身的。现象有同行把 Gabor 核和图像各自 FFT 之后直接逐点相乘再用逆变换当“滤波结果”发现识别率还不如不滤波。原因图像尺寸和核尺寸不同直接相乘做出来的是循环卷积图像的右边缘会卷绕到左边缘频域里引入一圈假的高频边界。解决如果要做真正卷积用cv2.filter2D做空域卷积或者 FFT 前把图像和核都 padding 到img ksize - 1。如果像我一样只是用掩码乘幅度谱没有做逆变换就不存在这个卷绕问题属于纯频域乘性处理语义完全不同别混用。第四个坑是特征库自洽性造成的识别率虚高。现象训练集和测试集在同一个摄像头、同一段光线、同一个背景下采集识别率 98%换一个摄像头立刻掉到 70%。原因特征把采集设备的固定噪声也当成了分类依据。FFT 幅度谱对周期性条纹、传感器固定模式噪声极其敏感这些噪声在同一个设备上完全一致最近邻匹配就是在匹配噪声。解决样本库至少要留出一个人或一个背景不参与建库当作独立验证集更可靠的做法是按采集批次划分训练只用批次 A验证用批次 B批次之间的识别率才是真实水平。4.3 实时识别抖动阈值设置的玄学第五个坑在实时视频里表现得最明显。现象手指没动屏幕上标签却在 2、5 两个值之间来回跳每帧预测都不一样。原因连续帧的归一化误差和随机噪声让特征向量在小范围内抖动而最近邻距离本身就很接近置信度始终在 0.5 附近徘徊。这属于阈值设置问题也是这个项目里最像玄学的一块。解决不要用单帧结果直接输出维护一个计数窗口只有连续三帧都预测同一个标签才切换显示同时把置信度阈值设到 0.6 以上低于这个值直接显示“待定”。两个条件同时满足才更新能过滤掉绝大多数抖动。提示滞后切换的窗口长度不要超过 5 帧否则手势变化时响应明显变慢用户体验像卡顿一样。5. 进阶技巧频域掩码去噪与不虚高的识别率验证5.1 用带阻掩码先去掉条纹噪声频域处理的另一个好处是去噪很直观。如果样本里出现周期性条纹比如显示器滚屏、反光网纹时域里难以定位频域里它就是一两个亮环直接用带阻掩码挖掉即可。def notch_mask(size128, center_rho0.35, radius0.03): 把以 zero frequency 为中心、半径约 center_rho 的环带置零。 yy, xx np.indices((size, size)) - size // 2 rho np.sqrt(xx ** 2 yy ** 2) / size band np.abs(rho - center_rho) radius return np.where(band, 0.0, 1.0)用法是在fftshift之后、取log1p之前和频谱做一次np.multiply。注意带阻掩码要克制着用挖掉的环带宽度不要超过0.05挖得太宽会把手指轮廓对应的真实频率一起抹掉识别率反而下降。这在频域处理里是个典型取舍去噪和保特征是同一个旋钮的两端。5.2 别让识别率虚高留验证集再看指标特征和分类器都完成后我最想强调的验证习惯是划分验证集。最近邻匹配在样本自洽时表现很漂亮但真正要判断能不能上线必须看跨批次的表现。我现在的固定做法是按采集 session 做五折每一折独立测打印每个类别的正确率再顺手输出一张混淆矩阵。如果某两类经常互相认错优先看它们在频域方向能量分布上是不是本来就接近比如 1 和 7 这种都有强竖边的数字靠方向特征本来就难分。这也影响我后续投入判断如果验证集正确率在 95% 左右波动说明这个方案值得继续调参如果换批次掉到 75%我不会去盲目加样本而是先检查归一化链路问题多半在采集端。这套手写数字手势识别里最关键的参数反而是那个最不起眼的1e-8它让零向量样本不至于在归一化时直接崩溃。我现在的习惯是任何距离计算和归一化都保留这个安全项已经替我省了好几次调试时间希望帮到你。本文还有配套的精品资源点击获取

相关新闻

523节全手写AI课:从零实现大模型,真正理解反向传播与Transformer

523节全手写AI课:从零实现大模型,真正理解反向传播与Transformer

1. 523节课背后的野心:为什么"全手写"才是这个开源AI课最狠的地方第一次看到"523节全手写实现"这个说法,我的反应是:这要么是个噱头,要么是个疯子干的事。原因很简单——现在市面上讲AI的课程,绝大…

2026/10/18 22:16:29 阅读更多 →
Python 3D可视化实战:五大核心库选型与用法

Python 3D可视化实战:五大核心库选型与用法

这两年我前前后后帮团队和线上朋友落地了不少 Python 3D 可视化项目,从最初科研报告里的静态曲面,到后来给业务方做的交互式点云看板,最深的体会就是:选对库比堆功能重要得多。Python 生态里能做 3D 的库少说也有十几个&#xff0…

2026/10/18 9:51:48 阅读更多 →
大数据脱敏实战:从算法选型到Spark SQL落地

大数据脱敏实战:从算法选型到Spark SQL落地

跟数据打了这么多年交道,我最大的感受是:生产环境的数据是最不能信的,因为它真实得让人害怕。我见过不止一次,开发同学随口说一句"把线上用户表导一份到测试库我调个bug",然后一张带着手机号、身份证号、家庭…

2026/10/16 15:55:42 阅读更多 →

最新新闻

2.42GHz宽带低相噪LC压控振荡器:调谐与噪声的平衡设计

2.42GHz宽带低相噪LC压控振荡器:调谐与噪声的平衡设计

简介:一份围绕2.42 GHz宽带低相噪LC压控振荡器的设计文档,面向射频集成电路设计人员、通信系统工程师及学习频率合成技术的高年级学生。方案采用开关电容阵列(SCA)与电压、电流滤波相结合的互补交叉耦合型LC VCO结构,先…

2026/10/18 22:16:34 阅读更多 →
baseflight飞控源码入门:从裸机主循环到混控输出的完整链路解析

baseflight飞控源码入门:从裸机主循环到混控输出的完整链路解析

简介:baseflight-master 是一套面向无人机飞控算法研究者的开源源码包,适合具备一定嵌入式与C语言基础的开发者学习或定制飞控特性。包内代码清晰展示飞控系统的核心运行逻辑:硬件初始化、传感器数据融合、PID姿态控制、命令解析、故障检测与…

2026/10/18 22:16:34 阅读更多 →
LLM填槽实战:从规则模板到结构化生成,打造高准确率对话系统

LLM填槽实战:从规则模板到结构化生成,打造高准确率对话系统

直接从从业者的角度切入,聊聊“LLM填槽”这件事。做了几年对话系统,从早期的规则模板一路折腾到大模型落地,我对填槽这件事的理解是:它本质上不是“解析字符串”,而是“从对话里复刻用户脑子里的完整需求”。这篇文章不…

2026/10/18 22:16:34 阅读更多 →
Python美食数据全链路实战:爬取清洗分析可视化闭环

Python美食数据全链路实战:爬取清洗分析可视化闭环

简介:本资源是一套完整的Python数据科学实战项目,面向数据分析初学者与爬虫爱好者,聚焦美食领域从数据获取到可视化呈现的全流程实践。项目涵盖网络爬虫(requestsBeautifulSoup)、数据清洗分析(pandasNumPy…

2026/10/18 22:16:34 阅读更多 →
如何用工作手机管理微信聊天?品牌推荐与选型参考(技术选型篇)

如何用工作手机管理微信聊天?品牌推荐与选型参考(技术选型篇)

摘要:本文从企业微信管理的真实痛点出发,拆解工作手机的核心能力要求,并对无极、云客、先发三款方案做横向对比,最后给出一套可直接落地的选型 CheckList,供销售团队管理员和 IT 负责人参考。一、管理需求:…

2026/10/18 22:16:34 阅读更多 →
SPACE沙箱生命周期完全指南:Running/Paused/Suspended三种状态如何选?附pause/suspend/wake实战

SPACE沙箱生命周期完全指南:Running/Paused/Suspended三种状态如何选?附pause/suspend/wake实战

【免费下载链接】SPACE Sandboxed Platform for Agentic Code Execution: pluggable-runtime sandboxes for running agent and user code in isolation. 项目地址: https://gitcode.com/gh_mirrors/space34/SPACE 点击查看 免费下载 SPACE 是一款面向 AI Agent 的…

2026/10/18 22:15:33 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →