<commit_before>---
layout: post
title: Scene text detection
tags: [计算机视觉] 
categories: [blog ]
notebook: 视觉算法
---

* content
{:toc}

## 定义
the process of predicting the presence of text and localizing each instance (if any), usually at word or line level, in natural scenes
<!-- the process of converting text regions into computer readable and editable symbols -->

## SWT算子
- [Detecting Text in Natural Scenes with Stroke Width Transform](http://cmp.felk.cvut.cz/~cernyad2/TextCaptchaPdf/Detecting%20Text%20in%20Natural%20Scenes%20with%20Stroke%20Width%20Transform.pdf)
- github: https://github.com/aperrau/DetectText

https://blog.csdn.net/liuxiaoheng1992/article/details/85305871

下面根据原文的结构和上述提供的代码详细的解读一下该算法。

总的来说该算法分为四步：
* 利用canny算子检测图片的边界
* 笔画宽度变换-Stroke Width Transform（这一步输出的图像我们称为SWT图像）
* 通过SWT图像得到多个连通域
* 通过自定义的规则过滤一些连通域，得到候选连通域
* 将连通域合并得到文本行

#### 利用canny算子检测图片的边界
这步不用多说，基础的图像处理知识，利用OpenCV 的Canny函数可以得到图片边缘检测的结果。

#### 笔画宽度变换（Stroke Width Transform）
这一步输出图像和输入图像大小一样，只是输出图像像素为笔画的宽度，具体如下。
![](../../images/ocr/SWT_01.png)

如上图所示，通过边缘检测得到上图a，假设现在从边缘上的点p开始，根据p点梯度的反方向找到边缘另一边的点q，如果p点的梯度与q点梯度的反方向夹角在$\pm\pi/6$之间，那么这两点间的距离为一个笔画宽度，那么p点和q点以及它们之间的像素在SWT输出图像中对应位置的值为p和q点的距离大小。

按照上述的计算方法会有两种情况需要考虑。如下图所示，

![](../../images/ocr/SWT_02.png)
<commit_msg>update scene text detection and recognization<commit_after>---
layout: post
title: 自然场景文本检测与识别
tags: [计算机视觉] 
categories: [blog ]
notebook: 视觉算法
---

* content
{:toc}

## 定义
the process of predicting the presence of text and localizing each instance (if any), usually at word or line level, in natural scenes
<!-- the process of converting text regions into computer readable and editable symbols -->
传统光学字符识别主要面向高质量的文档图像，此类技术假设输入图像背景干净、字体简单且文字排布整齐，在符合要求的情况下能够达到很高的识别水平。
与文档文字识别不同，自然场景中的文字识别：
* 图像背景复杂
* 分辨率低下
* 字体多样
* 分布随意等
现在我们只想单纯地想对字符进行识别，可以采取的策略：
* 使用谷歌开源OCR引擎Tesseract(需要对tesseract整理)
* 使用大公司的OCR开放平台（比如百度），使用他们的字符识别API(不适合商业应用)
* 传统方法做字符的特征提取，输入分类器，得出OCR模型
* 暴力的字符模板匹配法(计算量不小)
* 大杀器：基于深度学习下的CNN字符识别

## Tesseract源码分析

# 经典算法

## SWT算子
- [Detecting Text in Natural Scenes with Stroke Width Transform](http://cmp.felk.cvut.cz/~cernyad2/TextCaptchaPdf/Detecting%20Text%20in%20Natural%20Scenes%20with%20Stroke%20Width%20Transform.pdf)
- github: https://github.com/aperrau/DetectText

https://blog.csdn.net/liuxiaoheng1992/article/details/85305871

下面根据原文的结构和上述提供的代码详细的解读一下该算法。

总的来说该算法分为四步：
* 利用canny算子检测图片的边界
* 笔画宽度变换-Stroke Width Transform（这一步输出的图像我们称为SWT图像）
* 通过SWT图像得到多个连通域
* 通过自定义的规则过滤一些连通域，得到候选连通域
* 将连通域合并得到文本行

#### 利用canny算子检测图片的边界
这步不用多说，基础的图像处理知识，利用OpenCV 的Canny函数可以得到图片边缘检测的结果。

#### 笔画宽度变换（Stroke Width Transform）
这一步输出图像和输入图像大小一样，只是输出图像像素为笔画的宽度，具体如下。
![](../../images/ocr/SWT_01.png)

如上图所示，通过边缘检测得到上图a，假设现在从边缘上的点p开始，根据p点梯度的反方向找到边缘另一边的点q，如果p点的梯度与q点梯度的反方向夹角在$\pm\pi/6$之间，那么这两点间的距离为一个笔画宽度，那么p点和q点以及它们之间的像素在SWT输出图像中对应位置的值为p和q点的距离大小。

按照上述的计算方法会有两种情况需要考虑。如下图所示，

![](../../images/ocr/SWT_02.png)

{'fraction_non_alphanumeric': 0.1138268156424581, 'fraction_numerical': 0.023743016759776536, 'mean_word_length': 6.806539509536785, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1212759', 'n_tokens_mistral': 1804, 'n_tokens_neox': 1975, 'n_words': 185}