OpenCV二值化从入门到实战:固定阈值、大津法与自适应阈值详解

1. 从像素到黑白:二值化的本质与应用场景

1.1 二值化到底把图像变成了什么

一上来先别急着敲代码,先把“二值化”这三个字拆开。二值化本质上是对灰度图像做一次像素级分类:每个像素点的值只要大于某个阈值,就归到一类,小于等于阈值就归到另一类;在OpenCV里通常把这两类输出为255和0,也就是我们常说的白和黑。

生活化一点理解:灰度图是一张带明暗层次的炭笔画,二值化就是把它转成一张只有黑色剪影和白色背景的版画,所有中间调都被丢掉。丢掉中间调听起来像是损失信息,但对很多视觉任务来说,这是故意为之。因为后续算法往往不关心“这块灰到底是深灰还是浅灰”,只关心“这里有没有内容”。比如OCR需要知道哪些像素组成字符,工业检测需要知道哪个区域出现了缺陷,二维码识别需要区分黑白模块。把图片简化为两类后,计算量更小,特征更清晰,后续分割、识别、轮廓提取都会好做很多。

二值化几乎是所有图像处理教程里的第一课,不是因为简单,而是因为“阈值怎么定”这个问题,几乎贯穿整个视觉项目。同一张图换个光照条件,固定阈值就失效;换一个传感器,同样的参数输出完全不同。理解了二值化,你就理解了图像处理里最朴素也是最核心的“信息取舍”。

1.2 二值化之前,预处理是绕不开的

一个常见的错误是拿到BGR彩色图直接调threshold。OpenCV里threshold要求输入单通道灰度图,所以第一步永远是转灰度。OpenCV灰度化用的是加权公式,权重大概是R 0.299、G 0.587、B 0.114,不是简单取平均,因为人眼对绿色最敏感,对蓝色最不敏感。直接用平均也能算出灰度图,但效果往往偏暗,细节会丢。

不过只做灰度化还不够。二值化对噪声非常敏感,图像上的小脏点、传感器噪声、压缩块边缘,都可能被阈值误判成前景。常规做法是先做一步去噪,常见的是高斯模糊或中值滤波。高斯模糊适合抑制随机噪声,中值滤波对付椒盐噪声和细小颗粒效果更好,代价是笔画边缘可能被磨掉。到底选哪个,取决于你的图是文档扫描件还是工业相机照片,不要无脑套用。

还有一类预处理是光照校正。手机拍的文档经常出现一侧亮一侧暗,全局阈值根本没法照顾每个区域。这时常见的思路是先用大核模糊估计背景亮度,再把灰度图与背景做一次差分,或者直接改用后面的自适应阈值。总的原则是:二值化不是独立的一步,而是一条流水线的“分水岭”,前面预处理做到位,后面阈值才选得准。

2. 阈值怎么选:固定阈值、大津法与自适应阈值

2.1 固定阈值:最直观但最容易翻车

固定阈值是入门第一个方法,代码最简单:

import cv2 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

这段代码的意思是:原图里每个像素如果大于127,就设成255;小于等于127,就设成0。ret会返回实际使用的阈值,所以即使代码里写死127,也可以从ret里看到实际值。

固定阈值什么时候好用?当图像背景干净、光照均匀、前景和背景对比度很高的时候,它最稳。比如实验室里拍的纯黑背景上的白色标定板,或者扫描仪扫描的文档,这种图用固定阈值完全没问题。更合理的选法是看灰度直方图:如果图像有明显的两个峰,一个峰是背景,一个峰是前景,把阈值设在两峰之间的谷底,效果最好。通常这个谷底不一定是127,可能是100也可能是160。

但固定阈值的问题也很致命:它假设整张图的亮度条件一致。一旦图像出现阴影、渐变背景、不同批次亮度不一致,同一个阈值就会在这里把背景错认成前景,在那里又把前景漏掉。我处理过一张白纸上黑字的照片,右侧窗户光很亮,左侧有一块阴影,用固定127试出来,左侧大面积变成黑色块,右侧文字又偏淡。这种场景就不是阈值调到多少的问题了,而是这个方案本身不对,需要换下面的方法。

2.2 大津法:让算法自己找全局阈值

大津法的想法很简单:把所有可能阈值从0到255都试一遍,每个阈值都把像素分成两类。如果这两类的类间方差越大,说明前景和背景被分得越开;找到能让类间方差最大的那个灰度值,就是最佳阈值。

类间方差的直觉可以这样理解:假设一个班的学生按身高分两组,如果两组平均身高差异很大,而且人数比例也接近,说明分组分得很彻底;如果两组平均身高几乎一样,那这个分组就很失败。大津法就是把像素灰度当作身高,找一个分组方式让两组之间差异最大。

公式层面的核心是前景占比乘背景占比,再乘两类平均灰度之差的平方,也就是w0 * w1 * (μ0 - μ1)^2。OpenCV里一行就能用:

ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

注意这里阈值参数写0没有关系,大津法会自动算;ret返回的就是自动算出来的阈值。大津法最大的优点是省心,大部分光照均匀的场景都能自动找到合理的全局阈值,不需要人工试参。但它也有前提:图像直方图最好呈现双峰分布。如果背景纹理复杂、目标占比过大或过小、光照不均导致直方图只有一个大平坡甚至多个峰,大津法就容易跑偏。比如一片深色背景上放一个很小的白色物体,背景像素占比太高,算法会把绝大多数深色区域当成一类,阈值也会跟着偏移。此时不要迷信大津法,先看清楚你的图像是不是真双峰。

2.3 自适应阈值:局部算阈值,专治光照不均

自适应阈值不再全局固定一个值,而是对每个像素单独算一个阈值。基本做法是把图像划分成一个个局部窗口,对每个窗口计算一个参考值,也就是窗口内像素的平均值或高斯加权平均值,再用这个参考值减去一个常数C,作为当前像素的判决阈值。左侧阴影区域的局部参考值低,阈值也低;右侧高亮区域的参考值高,阈值也高,于是光照影响被抵消了一部分。

这个思路非常实用。手机拍摄的文档、执照翻拍、户外指示牌,基本都带有不均匀光照,全局阈值很难一次成功,自适应阈值往往是最适合的起点。OpenCV里的写法是:

thresh = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 10 )

参数里blockSize=15表示局部窗口是15x15,必须是奇数;C=10表示参考值再减10。自适应阈值的好处是能保留很多细节,尤其适合背景亮度缓慢变化的图像;坏处是如果窗口太小或者C太小,纸张纹理、水印、污渍这些低对比度区域也会被当成前景,导致结果很脏。而且它比大津法慢,因为要对每个像素做局部计算。但总体来说,在文档图像和自然场景文本类任务里,自适应阈值是出镜率最高的方案。

3. OpenCV二值化实现:函数细节与完整流程

3.1 threshold的五种模式,别再只知道BINARY

cv2.threshold不只支持“大于阈值设白,否则设黑”,它一共支持五种模式,用一张表说清楚:

模式像素 > 阈值时像素 <= 阈值时
THRESH_BINARY设为maxval(常见255)设为0
THRESH_BINARY_INV设为0设为maxval
THRESH_TRUNC截断为阈值保持原值
THRESH_TOZERO保持原值设为0
THRESH_TOZERO_INV设为0保持原值

真正意义上的二值化只有前两种。TRUNC和TOZERO保留了一部分灰度信息,更多用在图像增强、后处理场景里,但面试和项目里经常被拿来做原理考察,所以值得记住。

实际使用到底用BINARY还是BINARY_INV,取决于你希望前景是黑还是白。早期很多教材习惯输出黑字白底,也就是字符是0,背景是255;但OpenCV的形态学操作默认把白色当作前景来处理,膨胀、腐蚀、开闭运算也都是作用在白色区域上的。所以如果你后面要做连通域分析和形态学清理,通常更建议输出白字黑底,也就是用THRESH_BINARY_INV把文字变成255。这个选择看似小,却能省掉后面一大堆反色问题。

顺便提醒一句,maxval参数不一定是255。如果你需要的是一个0和1的mask,可以用maxval=1得到0和1的数组。但0和1的图像直接显示时几乎全黑,所以调试时先存255版本,真正交给模型或算法时再按需转换。

3.2 自适应阈值的blockSize和C,到底怎么调

自适应阈值最重要的两个参数是blockSize和C,这两个值直接影响能不能打好局部阈值这张牌。

blockSize是局部窗口的边长,必须是正奇数。窗口越小,局部性越强,对光照变化的响应越快,但也越容易被噪声和小纹理干扰;窗口越大,计算出的参考值越接近全局,光照校正能力会变弱,但结果更平滑。对常见文档照片,我一般从11、15、21这几个值开始试。如果图像分辨率很高,字符笔画在图像里占了很多像素,要同步调大。

C是一个偏置量,它决定前景的激活门槛。参考值减掉C之后,只有比这个结果更亮的像素才可能是前景。C越小,二值化越敏感,容易把轻微噪声、纸张纤维也拉进来;C越大,越能抑制低对比度噪声,但笔画也可能因此断掉。常见区间是5到15,但不要只看理论,最实用的办法是把两个参数组合跑一遍:

for bs in [11, 15, 21]: for c in [5, 10, 15]: th = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, bs, c ) cv2.imwrite(f"adaptive_bs{bs}_c{c}.png", th)

跑完之后用看图软件快速翻一遍,挑一张笔画完整、背景干净的结果,再回到参数去看规律。对比几组之后你会发现:字符出现断裂,优先把C调小或把blockSize调小;背景出现成片噪点,优先把C调大或把blockSize调大。先调一个参数,别两个一起乱动,否则永远不知道是哪个参数起了作用。

3.3 一个从彩图到干净二值图的完整流程

结合前面所有内容,我以一个手机拍摄的文档为例,写一条最常用的预处理流水线。假设原始图片是doc.jpg,画面里文字是深色,纸张是浅色,但纸张上有一部分阴影。

import cv2 import numpy as np img = cv2.imread("doc.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 第一步:去噪。文档照片用高斯模糊就够,核不要太大。 blurred = cv2.GaussianBlur(gray, (3, 3), 0) # 第二步:自适应阈值,让阴影区域也有自己的局部阈值。 # 原图是深色文字、浅色纸张,用BINARY_INV把文字变成白色前景。 thresh = cv2.adaptiveThreshold( blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 15, 10 ) # 第三步:形态学清理。此时文字是白色前景,背景是黑色。 kernel = np.ones((3, 3), np.uint8) clean = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) clean = cv2.morphologyEx(clean, cv2.MORPH_CLOSE, kernel) cv2.imwrite("doc_clean.png", clean)

解释一下三个关键步骤为什么这么排。高斯模糊的核用3x3,因为文档字符通常很细,核太大容易把笔画抹成一团;自适应阈值放在模糊之后,因为噪声被压掉了,局部阈值才不会被个别亮点带偏;形态学先开运算再闭运算,是因为开运算能去掉独立的小噪点,闭运算能连接因为阈值偏保守而产生的小断裂。

这里特别提醒:如果你用THRESH_BINARY而不是BINARY_INV,得到的会是黑字白底,形态学默认把白色背景当前景,开闭运算会作用在背景上,结果和预期完全相反。所以代码里的这一步一定要根据文字颜色判断清楚,不要照抄。

4. 二值化翻车现场:常见问题与排查技巧

4.1 光照不均,二值化结果东一块西一块

现象是整张二值图被割成“正常区”和“黑块区”,黑块往往正好落在阴影里。原因是全局阈值没办法适应局部亮度变化。解决思路第一选择是adaptiveThreshold,它会为每个局部区域单独定阈值。同时把blockSize稍微调大一些,避免局部窗口内只有文字没有背景,算出来的参考值失真。

如果阴影区域明暗对比实在太强,自适应阈值也压不住,试过比较有效的办法是:先用一个比较大的高斯核对灰度图做模糊,比如31x31或51x51,得到一张近似背景亮度的图,然后用原图减去背景亮度图,把光照变化削平,再做自适应阈值。这个操作不复杂,效果往往立竿见影,算是二值化前的小小光照校正。

4.2 二值化后全是细碎噪点,背景像撒了一把盐

当图像是低质量扫描件或者手机夜晚拍摄时,二值化结果容易出现密密麻麻的小白点。原因通常是原图噪声没有被提前滤掉,或者阈值定得太低,导致一些本来很暗的噪声也被划成前景。

处理顺序很重要:先在灰度图上做中值滤波,中值滤波对椒盐噪声和孤立点非常有效;再考虑用大津法代替固定阈值,让阈值靠近直方图谷底;最后才用一次开运算,把独立小点干掉。但如果噪点非常多,不要直接用大核开运算,否则文字也会被削薄。正确的做法是把去噪和阈值调整放在前面,形态学只是最后一道清扫。

4.3 文字断裂成一截一截,或者笔画粘成一条

字符断裂通常有两个原因:一是自适应阈值里的C设得太大,导致笔画中灰度略低的部分被判成背景;二是局部窗口太大,参考值被周围亮背景拉高,深色笔画边缘被误杀。解决办法是把C调小,同时把blockSize调小,比如从15调到11。如果断裂已经发生,可以用闭运算修复,先膨胀再腐蚀,把邻近断点连起来。

笔画粘连则往往反过来,是阈值偏低或噪声太多,导致笔画边缘不干净。处理时可以先做一次轻微腐蚀,把黏连部分断开,再考虑开运算。要注意形态学操作的核别一上来就定5x5、7x7,对细字文档来说,3x3才是安全的起点。膨胀腐蚀都是对白色前景操作的,所以确保你的二值化输出里文字是白色,否则先做一次bitwise_not。

4.4 反色问题:为什么二值图和预想完全反了

不少初学者会把“前景是文字”和“像素值为255”看成必然关系,其实threshold做的是“大于阈值设白”,和前景定义没有必然联系。深色文字配浅色背景,用THRESH_BINARY得到的是黑字白底;想让文字变白色,必须用THRESH_BINARY_INV。如果已经得到反色的图,不需要重新跑一遍,直接dst = cv2.bitwise_not(thresh)就能翻转。

判断需不需要反色,最简单的标准是看下一步操作。常见的OCR引擎,黑字白底和黑底白字通常都能处理;但用OpenCV做轮廓提取、面积过滤、形态学操作时,白色就是默认前景,此时把文字处理成白色会顺手很多。我有一个习惯:每个二值化项目的第一行就明确写下我的前景是0还是255,后面所有形态学、轮廓筛选都围绕这个定义展开,避免反复踩反色坑。

4.5 常见问题速查表

症状可能原因优先处理方式
大面积黑块或亮块光照不均但用了固定阈值换大津法或自适应阈值,先做光照校正
背景杂质多原图噪声没处理,C太小中值滤波或高斯模糊,调大C,开运算
笔画断裂C太大或blockSize太大调小C和blockSize,闭运算
笔画粘连噪声多或阈值偏低去噪、调高阈值,轻微腐蚀
前景背景反了不了解255和前景的关系用BINARY_INV或bitwise_not翻转
文字在二值化后明显变粗高斯核太大或C太小减小模糊核,调大C,后处理别过度膨胀

这张表是我平时排查问题最先看的东西。遇到二值化效果不对,先定位症状属于哪一类,再动参数,不要一上来把所有参数都改一遍。

5. 调参经验:我踩过几次坑之后养成的小习惯

5.1 拿到图,先看直方图,再决定用哪种阈值

很多人习惯直接丢进threshold,默认值127,然后调半天。我的建议是反过来,先看灰度直方图再选方法。用OpenCV算直方图很简单:

hist = cv2.calcHist([gray], [0], None, [256], [0, 256])

如果直方图是明显的双峰,固定阈值或大津法会很好用,阈值就在谷底附近;如果是单峰或者拖尾严重,说明图像背景或光照本身就不统一,老老实实走自适应阈值路线;如果前景在整幅图里占比特别小,大津法很容易被背景主导,这时反而手动看几个点的灰度值更有把握。直方图并不会直接给你答案,但它能帮你排除掉一批错误方案,少走很多弯路。

5.2 批量图片处理时,别只用一套固定参数

处理一批来源相同的图像时,固定参数的确省事,但只要设备、分辨率、光线条件变一个,同一套参数就会翻车。我现在的做法是:先取两到三张典型图试出基线参数,再批量跑大津法或自适应阈值作为兜底,同时把关键中间图保存下来做抽检。

分辨率变化对自适应阈值影响很大。同样的文档从低分辨率变成高分辨率,字符宽度近似变大一截,blockSize也要跟着放大,不然二值化结果全是断裂笔画。如果要从头估算起始参数,可以按图像宽度推算一个大致范围,再上下浮动试验。不要怕多试,批量处理前花十分钟做参数扫描,比跑完几千张再返工快得多。二值化调试最大的成本从来不是算力,而是返工。

5.3 二值化只是中间产物,后面还有连通域和轮廓分析

很多项目里,二值化只是第一道门槛,真正筛选目标靠的是轮廓分析。与其把每个像素都调得完美,不如让二值化结果保持“有点杂质但不漏目标”,然后靠轮廓面积、长宽比、填充率这些特征把关。比如背景里残留几点噪声,后续代码加一个连通域分析,面积小于阈值的区域直接忽略,比反复调阈值快得多,也更稳定。

我常用的思路是“先粗后精”:先用相对激进的自适应参数保证目标不丢,再通过形态学和小面积过滤把噪声清掉;如果反过来先追求背景绝对干净,很容易误伤真正的前景。图像处理里很少有参数能一劳永逸,二值化更是如此。做到后面你会发现,真正难的不是把图变成黑白,而是知道哪些该白、哪些该黑,以及什么时候该停下来接受一个够用但不完美的结果。

相关新闻

MATLAB小波分析实战手册:EEG/ECG/振动信号降噪与特征提取

MATLAB小波分析实战手册:EEG/ECG/振动信号降噪与特征提取

简介&#xff1a;本资源是《MATLAB小波分析超级学习手册》配套的完整程序代码包&#xff0c;面向信号处理、图像分析及科研工程领域的MATLAB初学者与进阶用户&#xff0c;聚焦小波理论落地与工程实践能力提升。压缩包含119个文件&#xff08;113个.m函数脚本、4个.wav测试音频、…

2026/10/20 12:23:13 阅读更多 →
华为交换机LACP链路聚合配置实战:负载分担与故障排查

华为交换机LACP链路聚合配置实战:负载分担与故障排查

1. 从一个真实故障说起&#xff1a;为什么单根网线永远不够用很多刚入行的网络运维同行都有过这样的经历&#xff1a;机房搬迁&#xff0c;核心交换机到接入交换机的链路只有一根千兆网线&#xff0c;业务高峰期一到&#xff0c;监控大屏上那条链路的使用率直接顶到95%以上&…

2026/10/20 12:23:13 阅读更多 →
数据预处理全攻略:从数据清洗到缺失值处理,打好数据分析地基

数据预处理全攻略:从数据清洗到缺失值处理,打好数据分析地基

做数据分析这几年&#xff0c;我见过太多人把精力全扑在算法调参上&#xff0c;反复调了好几天&#xff0c;模型效果怎么都上不去&#xff0c;最后排查来排查去才发现&#xff0c;问题根本不在模型&#xff0c;而是喂给模型的数据本身就没洗干净。脏数据、缺失值、量纲悬殊、时…

2026/10/20 12:23:13 阅读更多 →

最新新闻

Spring Boot社区在线问诊系统实战:从需求到部署的完整技术拆解

Spring Boot社区在线问诊系统实战:从需求到部署的完整技术拆解

最近后台经常有人问社区家庭医生在线问诊系统怎么做&#xff0c;正好我前阵子完整跟过一个类似项目&#xff0c;从需求梳理到部署上线走了不少弯路。我干脆把这套系统的技术拆解和踩坑记录整理成一篇长文&#xff0c;一方面给自己做个复盘&#xff0c;另一方面给正在做毕业设计…

2026/10/20 13:09:01 阅读更多 →
Git克隆Demo代码仓库实战:从地址到跑通全流程

Git克隆Demo代码仓库实战:从地址到跑通全流程

1. 拿到仓库地址后&#xff0c;先别急着敲命令很多同学第一次接触代码仓库时&#xff0c;最容易犯的毛病就是&#xff1a;复制了地址&#xff0c;打开终端&#xff0c;直接输入git clone&#xff0c;回车&#xff0c;然后开始疯狂刷新浏览器看着进度条发呆。如果仓库小&#xf…

2026/10/20 13:09:01 阅读更多 →
OpenHarmony设备上Flutter淡出过渡动画移植实战与性能优化

OpenHarmony设备上Flutter淡出过渡动画移植实战与性能优化

上个月我把一个原本跑在标准Flutter环境里的页面过渡动画方案移植到OpenHarmony设备上&#xff0c;遇到的第一个问题倒不是动画本身&#xff0c;而是animations 这个官方维护的三方动画库直接编译不过。项目里本来打算用它实现页面切换时的淡出过渡效果&#xff0c;想着省一笔自…

2026/10/20 13:09:01 阅读更多 →
轻量级技能管理方案:从零搭建可量化可组合的技能表

轻量级技能管理方案:从零搭建可量化可组合的技能表

1. 从“skills”这个词说起&#xff1a;它到底指什么“skills”这个词看起来简单&#xff0c;但放在不同语境里&#xff0c;指向完全不同。做招聘的人看到它&#xff0c;想到的是岗位能力模型&#xff1b;做在线教育的人看到它&#xff0c;想到的是课程标签体系&#xff1b;做开…

2026/10/20 13:09:01 阅读更多 →
企业级RAG问答系统实战:知识库、检索链路与大模型应用的完整落地指南

企业级RAG问答系统实战:知识库、检索链路与大模型应用的完整落地指南

做了将近半年的基于大模型的智能问答系统&#xff0c;上线之后我最大的感受是&#xff1a;**决定这套系统好不好用的&#xff0c;往往不是大模型本身&#xff0c;而是知识库和检索链路。**模型答得再聪明&#xff0c;检索不到对的资料&#xff0c;它也只能一本正经地编。我们做…

2026/10/20 13:09:01 阅读更多 →
GraphRAG工程实践:知识图谱如何补足向量检索的推理短板

GraphRAG工程实践:知识图谱如何补足向量检索的推理短板

向量检索失效的那一刻&#xff0c;我才决定认真搞GraphRAG年初做过一个企业内部制度问答系统&#xff0c;刚开始用的是经典的向量库RAG方案&#xff1a;文档切块、embedding、top-k召回、拼prompt喂给大模型。原型阶段跑得很顺&#xff0c;演示的时候领导问了一个问题——"…

2026/10/20 13:08:00 阅读更多 →

日新闻

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实现详解

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →