【OCR 学习笔记】二值化——局部阈值方法

news2024/12/28 9:29:39

二值化——局部阈值方法

  • 自适应阈值算法
  • Niblack算法
  • Sauvola算法

自适应阈值算法

自适应阈值算法1用到了积分图(Integral Image)的概念。积分图中任意一点 ( x , y ) (x,y) (x,y)的值是从图左上角到该点形成的矩形区域内所有值的和。即:
I ( x , y ) = ∑ x ′ ≤ x y ′ ≤ y i ( x ′ , y ′ ) I(x,y)=\sum_{\substack{x'\leq x \\ y' \leq y}}i(x',y') I(x,y)=xxyyi(x,y)
比如下图中的 9 9 9,就是左上角的 4 + 1 + 0 + 4 4+1+0+4 4+1+0+4
积分图

自适应算法的主要思想是以一个像素点为中心设置大小为 s × s s \times s s×s 的滑窗,滑窗扫过整张图像,每次扫描均对窗口内的像素求均值,并将均值的 1 − t % 1-t \% 1t% 作为局部阈值 。若窗口中心的像素值低于局部阈值 ,赋值0;高于局部阈值 ,赋值为255。这种算法需要对很多相互有重叠的区域进行多次加和计算。而积分图的使用可以有效地降低计算的复杂度和操作总次数。

为了计算积分图,需要在每个位置存储其左边和上方所有 f ( x , y ) f(x,y) f(x,y) 值的总和:
I ( x , y ) = f ( x , y ) + I ( x − 1 , y ) + I ( x , y − 1 ) − I ( x − 1 , y − 1 ) I(x,y)=f(x,y)+I(x-1,y)+I(x,y-1)-I(x-1,y-1) I(x,y)=f(x,y)+I(x1,y)+I(x,y1)I(x1,y1)
得出积分图之后,从滑窗左上角 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)到滑窗右下角 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)的矩形内的数值总和均可以使用式(1.1)计算:
∑ x = x 1 x 2 ∑ y = y 1 y 2 f ( x , y ) = I ( x 2 , y 2 ) − I ( x 2 , y 1 − 1 ) − I ( x 1 − 1 , y 2 ) + I ( x 1 − 1 , y 1 − 1 ) ( 1.1 ) \sum_{x=x_1}^{x_2}\sum_{y=y_1}^{y2}f(x,y)=I(x_2,y_2)-I(x_2,y_1-1)-I(x_1-1,y_2)+I(x_1-1,y_1-1) \qquad (1.1) x=x1x2y=y1y2f(x,y)=I(x2,y2)I(x2,y11)I(x11,y2)+I(x11,y11)(1.1)

如下图中左上角 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)到右下角 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)的矩形 D D D内的数值总和由它左边 C C C和上边 B B B以及左上角 A A A的矩形算得: ( A + B + C + D ) − ( A + B ) − ( A + C ) + A (A+B+C+D)-(A+B)-(A+C)+A (A+B+C+D)(A+B)(A+C)+A
矩形总和计算
或者仍然用下面这张图来理解吧:
矩形的算法
如果红色方框为滑窗区域,在原始数据中的和是 4 + 1 + 1 + 0 = 6 4+1+1+0=6 4+1+1+0=6。如果要通过右边的积分图来运算的话,就是 16 − 7 − 7 + 4 = 6 16-7-7+4=6 1677+4=6。可以看到用积分图计算出来的结果是准确的。

滑窗矩形区域的均值则为:
m ( x , y ) = ∑ x = x 1 x 2 ∑ y = y 1 y 2 f ( x , y ) ( x 2 − x 1 ) ⋅ ( y 2 − y 1 ) ( 1.2 ) m(x,y) = \frac{\sum_{x=x_1}^{x_2}\sum_{y=y_1}^{y2}f(x,y)}{(x_2-x_1) \cdot (y_2-y_1)} \qquad (1.2) m(x,y)=(x2x1)(y2y1)x=x1x2y=y1y2f(x,y)(1.2)

接着,就可以计算局部阈值了:
T ( x , y ) = m ( x , y ) ⋅ 100 − t 100 ( 1.3 ) T(x,y) = m(x,y) \cdot \frac{100-t}{100} \qquad (1.3) T(x,y)=m(x,y)100100t(1.3)

整个自适应阈值算法的过程共扫描全图2次:

  1. 第一次扫描获得积分图;
  2. 第二次扫描根据式 (1.1) 和 (1.2) 计算每次扫描窗口内像素值的平均值,然后根据 (1.3) 计算局部阈值。若窗口内某一像素点的值大于该阈值,则对应输出255,反之则输出0。

Niblack算法

Niblack算法同样是根据窗口内的像素值来计算局部阈值的,不同之处在于它不仅考虑到区域内像素点的均值和方差,还考虑到用一个事先设定的修正系数 k k k来决定影响程度。
T ( x , y ) = m ( x , y ) + k ⋅ s ( x , y ) T(x,y)=m(x,y)+k\cdot s(x,y) T(x,y)=m(x,y)+ks(x,y)

  • T ( x , y ) T(x,y) T(x,y)为阈值;
  • m ( x , y ) m(x,y) m(x,y)为均值;
  • s ( x , y ) s(x,y) s(x,y)为方差?标准差;

上式的定义的阈值的含义为与窗口内像素值的均值相差 k k k个标准差的值。小于阈值的判定为北京,反之则判定为前景。

Niblack算法的缺陷主要有两方面:

  1. r × r r \times r r×r 的滑窗会导致在边界区域 ( r − 1 ) / 2 (r-1)/2 (r1)/2 的像素方位内无法求取阈值;
  2. 如果 r × r r \times r r×r 滑窗内全部是背景,那么该算法必然会使该区域一部分像素点成为前景,形成伪噪声。

因此,滑窗的边长 r r r 的选取非常关键——若窗口太小,则可能会被背景包含,从而不能有效的抑制噪声;若窗口太大,则会导致细节丢失。

Sauvola算法

Sauvola算法2使针对文档二值化处理,在Niblack算法基础上的改进:
T = m [ 1 + k ( s R − 1 ) ] ( 3.1 ) T=m \left[1+k(\frac{s}{R}-1) \right] \qquad (3.1) T=m[1+k(Rs1)](3.1)

  • R R R 是标准方差的动态范围,若当前输入图像是8位灰度图像,则 R = 128 R=128 R=128

Sauvola算法在处理光线不均匀或染色图像时,比Niblack算法拥有更好的表现,因为(3.1)式以自适应的方式放大了标准差的作用。
乘以 m m m 系数会降低背景区域阈值的范围,这可以有效地减少染色、污渍等带来的影响。
Sauvola算法的二值化效果
从上图可以看出,在光照不均匀的情况下,Sauvola算法比Niblack能保留更多的细节。


  1. Bradley D, Roth G. Adaptive Thresholding using the Integral Image. Journal of Graphics Tools ,2007, 12:2, 13-21. DOI: 10.1080/2151237X.2007.10129236 ↩︎

  2. Lazzra G, Geraud T. Efficient Multiscale Sauvola Binarizaiton. International Journal on Document Analysis and Recognition, 2014, 17(2); 105-123. DOI: 10.1007/s10032-013-0209-0 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逻辑回归之鸢尾花数据集多分类任务

目录 1.导入数据 2.定义多分类模型 3.准备测试数据 4.绘制决策边界 对于多分类任务,其实就是多个二分类任务。 先分黑色(标签为1)和其他(标签为0),在这个基础上再去分红色和绿色,此时就将红色标签设置为1,其他设置为0&#x…

关于 Lora中 Chirp Spread Spectrum(CSS)调制解调、发射接收以及同步估计的分析

本文结合相关论文对CSS信号的数学形式、调制解调、发射接收以及同步估计做了全面分析,希望有助于更好地理解lora信号 long-range (LoRa) modulation, also known as chirp spread spectrum (CSS) modulation, in LoRaWAN to ensure robust transmission over long d…

Unity(2022.3.38LTS) - 页面介绍

目录 A. 创建项目 B.Unity 编辑器页面 C. 自己点点 A. 创建项目 有多个编辑器版本的选择编辑器. 3D和2D的区别就是初始化的包不同,这些包打开项目之后都可以在自行下载,随意切换, B.Unity 编辑器页面 Unity 编辑器页面是一个高度集成且功能丰富的开发环境,为游…

ISE14.7后仿真、烧录教程

ISE14.7后仿真、烧录教程 ISE14.7后仿真、烧录教程 系统版本:win10,EDA工具版本:ISE14.7,modelsim SE 10.4,本文主要包含两部分内容,首先是基于ISE的后仿真,基于ISE和modelsim的联合后仿真&am…

C++简单界面设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…

上海悠远为您解析芯片管理系统的核心功能

在当今科技日新月异的时代,芯片作为信息技术的基石,其管理效率与安全性直接关系到整个系统的稳定运行与数据安全。因此,一个高效、智能的芯片管理系统成为了不可或缺的技术支撑。该系统通过集成多项核心技术,实现了对芯片从生产到…

统信UOSV20 安装redis

在线安装 在统信软件(UOS)上使用yum安装Redis,可以按照以下步骤进行: 打开终端。首先添加Redis的官方仓库,可以使用以下命令: sudo yum install epel-release安装Redis: sudo yum install r…

简单的spring boot tomcat版本升级

简单的spring boot tomcat版本升级 1. 需求 我们使用的springboot版本为2.3.8.RELEASE,对应的tomcat版本为9.0.41,公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应,从而可能导致获取其他用户先前请求的数据,造…

c# 直接使用c++ 类库文件

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

基于JSP的足球赛会管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:JSPJavaBeansServlet 工具:Eclipse、Navicat、Maven 系统展示 首页 管理员功能模块 用…

Linux:动态库和静态库

静态库与动态库 A:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 B:动态库(.so):程序在运行的时候才去链接动态库的代码&#…

Ubuntu24.04设置国内镜像软件源

参考文章: Ubuntu24.04更换源地址(新版源更换方式) - 陌路寒暄 一、禁用原来的软件源 Ubuntu24.04 的源地址配置文件发生改变,不再使用以前的 sources.list 文件,升级 24.04 之后,该文件内容变成了一行注…

Java | Leetcode Java题解之第334题递增的三元子序列

题目&#xff1a; 题解&#xff1a; class Solution {public boolean increasingTriplet(int[] nums) {int n nums.length;if (n < 3) {return false;}int first nums[0], second Integer.MAX_VALUE;for (int i 1; i < n; i) {int num nums[i];if (num > second…

日常网站优化:SEO的6项目日常例行工作

大部分人每天都会登录自己的网站&#xff0c;或者至少每周登录一次。但是&#xff0c;如果你是一家小企业或者团队的负责人&#xff0c;你可能会有很多其他的工作要做&#xff0c;相对的&#xff0c;就没有那么多的时间可以花在SEO上。 当然您也可以选择一个专业的团队&#x…

差异对比:云服务器PK物理服务器

【若您对以下内容感兴趣&#xff0c;欢迎联系或关注我们】 在服务器领域&#xff0c;云服务器和物理服务器是两种常见的选择&#xff0c;它们在多个方面存在明显的区别。 一、资源虚拟化 云服务器&#xff1a;基于物理服务器通过虚拟化技术构建而成&#xff0c;多个虚拟服务…

flutter 画转盘

import package:flutter/material.dart; import dart:math;const double spacingAngle 45.0; // 每两个文字之间的角度 // 自定义绘制器&#xff0c;ArcTextPainter 用于在圆弧上绘制文字 class ArcTextPainter extends CustomPainter {final double rotationAngle; // 动画旋…

多种办公功能的WORD VBA程序

word的VBA办公助手 源代码 Option Explicit 需要引用 excel 16.0 库 所有内容仅供个人学习使用&#xff0c;严禁传播。1-公共变量-表格属性------------------------------------------------------------------------- Dim Hg% hg:行高 Const K1 0.1 Dim Flg_bh As Boolean …

力扣题/二叉树/二叉树中的最大路径和

二叉树中的最大路径和 力扣原题 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树…

景联文科技:图像标注的类型有哪些?

图像标注是计算机视觉领域中一个非常重要的步骤&#xff0c;它是创建训练数据集的关键组成部分&#xff0c;主要用于帮助机器学习算法理解图像内容。 以下是图像标注的一些主要类型&#xff1a; 1. 边界框标注&#xff1a; • 这是最常见的标注方式之一&#xff0c;通常用于…

Python深度学习框架库之caffe使用详解

概要 Caffe 是一个由伯克利视觉与学习中心(BVLC)开发的深度学习框架,以其速度快、模块化设计和社区支持而闻名。Caffe 适用于视觉识别任务,广泛应用于学术研究和产业实践中。Caffe 提供了一个强大的 Python 接口,使开发者能够方便地使用 Python 进行深度学习模型的开发和…