【OCR学习笔记】5、OCR传统特征提取方法(文末附python源码实现下载)(二)

本文涉及的产品
个人证照识别,个人证照识别 200次/月
教育场景识别,教育场景识别 200次/月
车辆物流识别,车辆物流识别 200次/月
简介: 【OCR学习笔记】5、OCR传统特征提取方法(文末附python源码实现下载)(二)

2.2 傅里叶特征算子

傅里叶特征算子,又称傅里叶形状描述子主要作用是通过对目标边界的轮廓进行离散傅里叶变换得到目标边界形状的定量表达。可以将图像的信号从时域转换到频域。

  • 傅里叶形状描述子

当确定了图像中的目标区域的起始点以及方向之后,可以利用一系列的坐标对来描述边界的信息了。假设边界上有个边界点,起始点为,按照顺时针方向可以表示为一个坐标序列:

aae7ddb4202f7e793ad533bcea13ef19.png

一般来说,如果将目标边界看成是从某一个点出发,则沿着该边界顺时针旋转一周的周边长可以用一个复函数来表示。换句话说就是,边界上点的坐标可以用如下复数来表示:

07a5e1d14f3dd8a5f60c790f42301121.png

通过这种方式,可以成功地将坐标序列的二维表示转换为一维表示。对于复数,可以用一个一维离散傅里叶变换系数来表示:

5d969e48a8a8e46cfbfbf327322ba8a5.png

这里的是图像边界的傅里叶描述子。同理,如果对进行傅里叶反变换,则可以得到最开始的坐标序列的表达式(仅选取前L个傅里叶变换系数近似):

246bfec268cbf137c12d1e2c2866cf90.png

低阶系数表示的是边界的大致形状高阶系数表示的是边界的细节特征。傅里叶描述子在描述边界时,对旋转、平移、尺度变化等均不敏感

# -*- coding: utf-8 -*-
import sys
import numpy as np
import cv2
import math
# 快速傅里叶变换
def fft2Image(src):
    # 得到行、列
    r, c = src.shape[:2]
    # 得到快速傅里叶变换最优扩充
    rPadded = cv2.getOptimalDFTSize(r)
    cPadded = cv2.getOptimalDFTSize(c)
    # 边缘扩充,下边缘和右边缘扩充值为零
    fft2 = np.zeros((rPadded, cPadded, 2), np.float32)
    fft2[:r, :c, 0] = src
    # 快速傅里叶变换
    cv2.dft(fft2, fft2, cv2.DFT_COMPLEX_OUTPUT)
    return fft2
# 傅里叶幅度谱
def amplitudeSpectrum(fft2):
    # 求幅度
    real2 = np.power(fft2[:, :, 0], 2.0)
    Imag2 = np.power(fft2[:, :, 1], 2.0)
    amplitude = np.sqrt(real2 + Imag2)
    return amplitude
# 幅度谱的灰度级显示
def graySpectrum(amplitude):
    # 对比度拉伸
    # cv2.log(amplitude+1.0,amplitude)
    amplitude = np.log(amplitude + 1.0)
    # 归一化,傅里叶谱的灰度级显示
    spectrum = np.zeros(amplitude.shape, np.float32)
    cv2.normalize(amplitude, spectrum, 0, 1, cv2.NORM_MINMAX)
    return spectrum
# 相位谱
def phaseSpectrum(fft2):
    # 得到行数、列数
    rows, cols = fft2.shape[:2]
    # 计算相位角
    phase = np.arctan2(fft2[:, :, 1], fft2[:, :, 0])
    # 相位角转换为 [ -180 , 180]
    spectrum = phase / math.pi * 180
    return spectrum
# 主函数
if __name__ == "__main__":
    image = cv2.imread('../picture/fuliye.png', 0)
    # 显示原图
    cv2.imshow("image", image)
    # cv2.imwrite("img1.jpg",image)
    # 快速傅里叶变换
    fft2 = fft2Image(image)
    # 求幅度谱
    amplitude = amplitudeSpectrum(fft2)
    amc = np.copy(amplitude)
    amc[amc > 255] = 255
    amc = amc.astype(np.uint8)
    # cv2.imshow("originam",amc)
    # cv2.imwrite("orAmp.jpg",amc)
    # 幅度谱的灰度级显示
    ampSpectrum = graySpectrum(amplitude)
    ampSpectrum *= 255
    ampSpectrum = ampSpectrum.astype(np.uint8)
    cv2.imshow("amplitudeSpectrum", ampSpectrum)
    # cv2.imwrite("ampSpectrum.jpg",ampSpectrum)
    # 相位谱的灰度级显示
    phaseSpe = phaseSpectrum(fft2)
    cv2.imshow("phaseSpectrum", phaseSpe)
    # cv2.imwrite("phaseSpe.jpg",phaseSpe)
    '''
    傅里叶幅度谱的中心化
    '''
    # 第一步:图像乘以(-1)^(r+c)
    rows, cols = image.shape
    fimg = np.copy(image)
    fimg = fimg.astype(np.float32)
    for r in range(rows):
        for c in range(cols):
            if (r + c) % 2:
                fimg[r][c] = -1 * image[r][c]
            else:
                fimg[r][c] = image[r][c]
    # 第二步:快速傅里叶变换
    imgfft2 = fft2Image(fimg)
    # 第三步:傅里叶的幅度谱
    amSpe = amplitudeSpectrum(imgfft2)
    # 幅度谱的灰度级显示
    graySpe = graySpectrum(amSpe)
    cv2.imshow("amSpe", graySpe)
    graySpe *= 255
    graySpe = graySpe.astype(np.uint8)
    cv2.imwrite("centerAmp.jpg", graySpe)
    # 第四步:相位谱的灰度级显示
    phSpe = phaseSpectrum(imgfft2)
    cv2.imshow("phSpe", phSpe)
    # cv2.imwrite("centerphSpe.jpg",phSpe)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

原图

傅里叶变换后的图

傅里叶变换后的频谱图

2.3 形状不变矩法

形状不变矩法的主要思想是将对变换不敏感的、基于区域的几何矩特征作为形状特征。之所以称之为“不变矩”,是因为矩特征在旋转、平移、尺度缩放的环境下都不会发生改变。

详细内容可以参考《深度实践OCR——基于深度学习的文字识别

2.4 几何参数法

几何参数法主要包括像素与邻域、位置、方向、距离、区域周长和区域面积。

详细内容可以参考《深度实践OCR——基于深度学习的文字识别


3 基于几何分布的特征提取方法


基于几何分布的特征提取方法大致可以分为两类,1)二维直方图投影法2)另一类是区域网格统计法

3.1 二维直方图投影法

几何分布特征提取方法的代表之一就是二维直方图投影法,也就是获取水平以及竖直方向上各行、列黑色像素累计分布的结果,如下图所示:

二维直方图投影示意图

由于图片经过归一化后,长宽相对固定,例如32×36像素的二值字符“3”如图a所示。一般二维直方图投影法对图像的扫描顺序为从上到下、从左往右,所以得到的对应数字矩阵如图b所示。

在水平方向和竖直方向分别对原图进行投影,然后分别按照行列方向统计黑色像素的值且进行归一化,最终得到特征向量。

3.2 区域网格统计法

区域网格统计法是另一种常见的基于几何分布的特征提取方法。其主要思想是先利用一个m×n的网格将原图进行分割,然后按从上至下、从左至右的顺序依次统计每一个网格中“1”的个数,从而得到最终的特征向量。以上面的二值字符“3”为例,我们用一个3×4的网格对其进行分割,得到的结果如图所示:

区域网格统计法示例

相关文章
|
3月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
432 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
18天前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
2月前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
2月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
3月前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
664 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
3月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
3月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
3月前
|
Python
Python 三方库下载安装
Python 三方库下载安装
44 1
|
3月前
|
机器学习/深度学习 缓存 PyTorch
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
这篇文章是关于如何下载、安装和配置Miniconda,以及如何使用Miniconda创建和管理Python环境的详细指南。
742 0
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
|
3月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
81 1

热门文章

最新文章

  • 1
    【Python】已解决:Python正确安装文字识别库EasyOCR
    928
  • 2
    提升爬虫OCR识别率:解决嘈杂验证码问题
    200
  • 3
    文本,文字识别14,身份证和车牌识别接口
    47
  • 4
    文本,文字识别13,参数校验,实现参数校验,使用@Valid注解
    33
  • 5
    文本,文字识别12,接口返回值和异常封装,一个好的接口,应该包括,错误码,提示信息,返回的数据,应该知道出错,错在哪里,抛出业务异常应该怎样解决?出现业务异常的时候,抛出业务异常,全局异常处理
    50
  • 6
    文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
    148
  • 7
    文本,文识10,springBoot提供RestTemplate以调用Flask OCR接口,调用flask实现ocr接口,用paddleocr进行图片识别云服务技术,单个paddleocr接口有影响
    123
  • 8
    文本,文识08图片保存()上,最方便在于整体生成代码,serivce及实体类,base64编码保存图片文件,调用flask实现内部ocr接口,通过paddleocr识别,解析结果,base64转图片
    75
  • 9
    文本,文字识别07,SpringBoot服务开发-入参和返回值,编写接口的时候,要注意识别的文字返回的是多行,因此必须是List集合,Bean层,及实体类的搭建
    65
  • 10
    文本,文字识别,Flask实现内部接口开发,OCR外部接口的开发,如何开发一个识别接口,通过post调用,参数是图片的路径,内部调用,直接传图片路径就行
    82