自适应阈值法(图文总结)

概念:

该方法网上很多很简洁但是很难懂的公式,本文章将会由简单例子入手,一步步去理解那些公式,但是不做代码实现,毕竟只要搞懂了这个算法的思想,代码的实现其实千变万化,甚至用CV库的话根本不用写代码。

为啥出现这个二值化算法,OTSU的致命缺陷在哪里?

在大津算法OTSU中,由于采取的都是全局均值求出最佳全局阈值,但是在图片光照不均匀的场景,很容易把稍微模糊的边缘目标图像当作背景,为了避免这种场景,我们就可以考虑更为细腻的局部自适应阈值,它是根据图像不同区域亮度,不断计算更新局部阈值,同时不断“刷新”局部图像,直到把整张目标图像都“刷”一遍,所以对于图像不同区域,自适应不同的阈值,因此称为局部自适应阈值法。
如下图所示:
在这里插入图片描述
中间我用白线区分的部分,假设全局阈值法做二值化,光亮部分较多的话,整体灰度值亮度偏高,导致右上角阴暗处文字被填充为黑色,只保留了左下角的部分文字,这显然是人工智障,那我们人又是如何知道暗的部分也需要识别的呢?又该怎么教会机器呢?

案例:

仔细想,其实我们是能适应从很亮到很暗的书页字体颜色的一个变化,所以能准确抓住哪部分该识别,哪部分不用识别,假如我们让机器也有这个能力,那它也会慢慢学到“暗”的地方的文字也要识别
再细想一下,二值化的最重要一点,就是阈值,那么我们有什么办法,让阈值不是一个全局的固定的值,而是根据图像各个部位不同,稍微做一些调整呢?

移动平均法,这个初中还是高中学的公式就派上用场了,首先我们把图像切分成N个小部分:
在这里插入图片描述
基于初次切分的每个小格,再做一次简单分割,得到下图左上角所示:
在这里插入图片描述
这样我们假设可以获得左上角的四个区域,每个区域内的M个像素点的平均灰度值为u1,u2,u3,u4, 那么这四个区域围起来代表的红色区域内的平均灰度值就是 (大写)U1 = (u1+u2+u3+u4) / 4 ,得到一个小格的比较准确的平均灰度值阈值,按照这个方法我们再往后推几个格子

⚠️注意,很多网上例子是说用像素点,但是实际项目中,一张图像可能就百M上G,几G甚至更多,用像素点效率很低,所以这里举例子采用细分区域的平均值,其实核心思想一样,
这里例子用的22网格,现实也可以根据实际情况选择55,66,99……

在这里插入图片描述

这个时候,按照移动平均法的公式不断更新一个全局的浮动阈值:UT
UT = (U1+U2+U3+U4+U5) / 5

这个阈值就能很好“识别”阴暗处的文字,为什么呢?因为U1,U2,U3的平均阈值亮度很高,但是“刷”过U4区域的时候,已经“被平均”了,也就是区分的阈值亮度被“拉低”了,这样在U5甚至接下来的U6,U7区域,它也能很快的“适应”光线的变化,准确“读”出二值化识别的目标文字
疑问:万一U4这个过渡区域无法瞬间拉低阈值,怎么办?
好办

方法一:把图像再分割细一点,让刷过去的速度更慢,让阈值有充分的过渡区域可以降低

在这里插入图片描述

方法二:把前一个区域的阈值进行百分比取值,也就是只取上一次的百分之几黑度,相当于“我会借鉴/参考前任的经验但是我有我区域的特殊情况,我不会100%按照别人的阈值经验来搞”,这个百分比取值可以通过多次尝试来找到分割效果最好的那一个

例如:
设i区域内的像素点灰度值为[p1,p2,p3…pi],区域的平均阈值为:Ui
t 为pi区域之前的s个像素点的灰度平均阈值的百分比
那么当前区域我的阈值就设为:
Ui+ = Ui / ( 100 - t /100)

有了上面的基础,我们怎么用这一个不断变化的阈值去二值化我们的目标图像呢?

网上有很多例子都是黑底/深色底,白图/浅色图;这里案例用的是白底黑字,目标图像是黑字,那么做二值化时候判断:
设i区域内的像素点灰度值为[p1,p2,p3…pi],区域的平均阈值为:Ui,t 为pi区域之前的s个像素点的灰度平均阈值的百分比
Ui+ = Ui / ( 100 - t /100)
px < Ui+ ?
阈值/100会得到一个更小的灰度值分割值,这个100是可以调整的,不一定写死,如果该像素点比更小的分割都小,也就是还要接近黑,那么直接输出黑
是的话,输出0 (代表黑)
不是的话,输出255(代表白)

以上就是我关于自适应阈值法的总结,图片都是自己P的,如果有错误的地方恳请大佬纠正,一起交流学习

### Python 实现 OCR 文字识别 要使用 Python 实现 OCR (Optical Character Recognition) 功能,可以借助一些开源库和技术栈完成这一目标。以下是实现过程的具体说明: #### 使用 Tesseract 和 Pytesseract 进行 OCR Tesseract 是一个强大的 OCR 工具,支持多种语言和复杂的字符集。Pytesseract 则是一个用于调用 Tesseract 的 Python 封装库。 1. **安装依赖项** 需要先安装 Tesseract 并将其路径配置到环境变量中[^1]。可以通过以下命令安装必要的工具和库: ```bash sudo apt install tesseract-ocr pip install pytesseract pillow ``` 2. **加载图像并执行 OCR** 下面是一段简单的代码示例,展示如何读取一张图片并提取其中的文字内容: ```python from PIL import Image import pytesseract # 加载图像 image_path = 'example.png' img = Image.open(image_path) # 设置 Tesseract 路径(如果未自动检测) pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract' # 提取文字 text = pytesseract.image_to_string(img, lang='eng') print(text) ``` 3. **高级功能** 如果需要更详细的 OCR 结果,比如位置信息或其他元数据,可以使用 `image_to_data` 方法获取更多细节: ```python data = pytesseract.image_to_data(img, output_type=pytesseract.Output.DICT) for i in range(len(data['text'])): if int(data['conf'][i]) > 60: # 置信度大于 60% bbox = { 'left': data['left'][i], 'top': data['top'][i], 'width': data['width'][i], 'height': data['height'][i], 'text': data['text'][i] } print(bbox) ``` #### 处理复杂场景下的 OCR 对于某些特殊需求,例如身份证件上的文字识别或特定格式的表格解析,可能需要用到预处理技术和深度学习模。下面列举了一些常见方法: 1. **图像增强与预处理** 图像的质量直接影响 OCR 效果。因此,在实际应用前通常会对原始图片进行灰度化、去噪和平滑等操作。 ```python import cv2 # 加载图像 img_cv = cv2.imread('example.png', cv2.IMREAD_GRAYSCALE) # 应用高斯模糊去除噪声 blurred_img = cv2.GaussianBlur(img_cv, (5, 5), 0) # 自适应阈值分割提高对比度 thresholded_img = cv2.adaptiveThreshold(blurred_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) ``` 2. **利用深度学习框架提升精度** 对于更加复杂的场景,如手写体识别或者低分辨率图片,推荐采用基于 TensorFlow 或 PyTorch 训练好的专用 OCR 模。这些模能够显著改善传统算法难以应对的情况[^3]。 --- ### 总结 通过上述方式即可快速搭建起一套基础版的 Python OCR 系统。无论是简单文档还是复杂背景下的图文混合材料都能得到较好的解读效果。当然,针对具体业务还应考虑优化性能以及适配个性化参数设置等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值