什么是图像二值化
在日常拍照中,有时候照片背景杂乱、文字模糊,比如拍了一份手写笔记或者一张旧报纸,想把上面的文字提取出来,但灰度层次太多,看不清重点。这时候,图像处理里的“二值化”就派上用场了。简单说,二值化就是把一张彩色或灰度图变成只有黑和白两种颜色的图像,每个像素点非黑即白,看起来像老式传真机打出来的效果。
这种处理方式的核心思想是设定一个阈值。比如,所有像素值大于这个阈值的变成白色(255),小于等于的变成黑色(0)。这样一来,图像的信息被极大简化,反而更容易进行后续操作,比如文字识别、轮廓提取、目标检测等。
常见的二值化方法
最基础的是全局阈值法,也就是整个图像使用同一个阈值。OpenCV 里有个经典的函数 cv2.threshold() 就能实现:
<import cv2>
<import numpy as np>
<img = cv2.imread('note.jpg', 0) # 灰度读取>
<ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)>
<cv2.imshow('Binary Image', binary)>
<cv2.waitKey(0)>
<cv2.destroyAllWindows()>这段代码会把一张图片转成黑白图,阈值设为127。如果原图亮度分布比较均匀,这招挺管用。但要是光照不均,比如左边亮右边暗,那统一用一个阈值就会出问题——一边字迹消失,另一边全是噪点。
自适应二值化解决光照不均
这时候就得上自适应阈值法。它不是全图一刀切,而是以每个像素为中心,取周围一小块区域,动态计算局部阈值。OpenCV 提供了 cv2.adaptiveThreshold() 函数:
<binary_adapt = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,>
< cv2.THRESH_BINARY, 11, 2)>这里的参数意味着:用高斯加权计算局部均值,窗口大小11×11,最后再减去2作为微调。这样处理后,即使拍的是斜着打光的纸质文档,也能清晰还原文字内容。
Otsu 方法:让机器自己选阈值
还有一种聪明的办法叫 Otsu 法,它能自动找出最佳分割阈值,特别适合前景和背景对比明显但具体数值未知的情况。只需要在 cv2.threshold() 中加上标志位:
<ret, binary_otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)>函数会遍历所有可能的阈值,找到能让类间方差最大的那个点。实际用下来,扫描文档、车牌识别这类场景下,Otsu 效果往往比手动调阈值更稳定。
应用场景不止于文档扫描
别以为二值化只是用来清理照片那么简单。在工业质检中,产品表面有没有裂纹,可以通过二值化突出缺陷区域;在医学影像里,X光片中的骨骼边缘也能靠这一步骤初步勾勒;甚至人脸识别预处理阶段,也会先做类似操作来降低干扰。
手机App里的“文档矫正”功能,背后基本都藏着一套完整的二值化流程。你拍完照,系统自动增强对比度、去阴影、再二值化,最后生成一份像打印机扫出来一样的干净文件,方便存档或转发。
虽然现在深度学习模型越来越强,可以直接端到端处理原始图像,但在资源有限的设备上,比如嵌入式相机或低端手机,二值化这种轻量高效的预处理手段依然不可替代。它像是图像处理的第一道筛子,把复杂世界先分成“有”和“无”,让机器看得更明白。