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

简介: 【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的网格对其进行分割,得到的结果如图所示:

区域网格统计法示例

相关文章
|
6月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
506 1
|
7月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
252 2
|
7月前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
209 0
|
7月前
|
传感器 大数据 API
Python数字限制在指定范围内:方法与实践
在Python编程中,限制数字范围是常见需求,如游戏属性控制、金融计算和数据过滤等场景。本文介绍了五种主流方法:基础条件判断、数学运算、装饰器模式、类封装及NumPy数组处理,分别适用于不同复杂度和性能要求的场景。每种方法均有示例代码和适用情况说明,帮助开发者根据实际需求选择最优方案。
337 0
|
7月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
6月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
924 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
8月前
|
安全 Python
Python语言中常用的文件操作方法探讨
通过上述方法的结合使用,我们可以构筑出强大并且可靠的文件操作逻辑,切实解决日常编程中遇到的文件处理问题。
308 72
|
6月前
|
机器学习/深度学习 数据采集 算法
基于mediapipe深度学习的运动人体姿态提取系统python源码
本内容介绍了基于Mediapipe的人体姿态提取算法。包含算法运行效果图、软件版本说明、核心代码及详细理论解析。Mediapipe通过预训练模型检测人体关键点,并利用部分亲和场(PAFs)构建姿态骨架,具有模块化架构,支持高效灵活的数据处理流程。
|
9月前
|
存储 机器学习/深度学习 人工智能
稀疏矩阵存储模型比较与在Python中的实现方法探讨
本文探讨了稀疏矩阵的压缩存储模型及其在Python中的实现方法,涵盖COO、CSR、CSC等常见格式。通过`scipy.sparse`等工具,分析了稀疏矩阵在高效运算中的应用,如矩阵乘法和图结构分析。文章还结合实际场景(推荐系统、自然语言处理等),提供了优化建议及性能评估,并展望了稀疏计算与AI硬件协同的未来趋势。掌握稀疏矩阵技术,可显著提升大规模数据处理效率,为工程实践带来重要价值。
427 58
|
7月前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
387 4

推荐镜像

更多