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

本文涉及的产品
票证核验,票证核验 50次/账号
通用文字识别,通用文字识别 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的网格对其进行分割,得到的结果如图所示:

区域网格统计法示例

相关文章
|
1月前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
|
1月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
3月前
|
机器学习/深度学习 监控 算法
基于mediapipe深度学习的手势数字识别系统python源码
本内容涵盖手势识别算法的相关资料,包括:1. 算法运行效果预览(无水印完整程序);2. 软件版本与配置环境说明,提供Python运行环境安装步骤;3. 部分核心代码,完整版含中文注释及操作视频;4. 算法理论概述,详解Mediapipe框架在手势识别中的应用。Mediapipe采用模块化设计,包含Calculator Graph、Packet和Subgraph等核心组件,支持实时处理任务,广泛应用于虚拟现实、智能监控等领域。
|
2月前
|
安全 Python
Python语言中常用的文件操作方法探讨
通过上述方法的结合使用,我们可以构筑出强大并且可靠的文件操作逻辑,切实解决日常编程中遇到的文件处理问题。
160 72
|
1月前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
|
5月前
|
机器学习/深度学习 数据可视化 算法
Python数值方法在工程和科学问题解决中的应用
本文探讨了Python数值方法在工程和科学领域的广泛应用。首先介绍了数值计算的基本概念及Python的优势,如易学易用、丰富的库支持和跨平台性。接着分析了Python在有限元分析、信号处理、优化问题求解和控制系统设计等工程问题中的应用,以及在数据分析、机器学习、模拟建模和深度学习等科学问题中的实践。通过具体案例,展示了Python解决实际问题的能力,最后总结展望了Python在未来工程和科学研究中的发展潜力。
109 0
|
3月前
|
存储 机器学习/深度学习 人工智能
稀疏矩阵存储模型比较与在Python中的实现方法探讨
本文探讨了稀疏矩阵的压缩存储模型及其在Python中的实现方法,涵盖COO、CSR、CSC等常见格式。通过`scipy.sparse`等工具,分析了稀疏矩阵在高效运算中的应用,如矩阵乘法和图结构分析。文章还结合实际场景(推荐系统、自然语言处理等),提供了优化建议及性能评估,并展望了稀疏计算与AI硬件协同的未来趋势。掌握稀疏矩阵技术,可显著提升大规模数据处理效率,为工程实践带来重要价值。
160 58
|
3月前
|
人工智能 文字识别 自然语言处理
熊猫 OCR 识别软件下载,支持截图 OCR、PDF 识别、多语言翻译的免费全能工具,熊猫OCR识别
本文介绍了几款实用的图文识别软件,包括熊猫OCR、Umi-OCR和天若OCR_本地版。熊猫OCR功能强大,支持多窗口操作、AI找图找色、OCR识别等;Umi-OCR免费且高效,具备截图OCR、批量处理等功能;天若OCR界面简洁,适合快速文字识别。文章还提供了下载链接及软件特点、界面展示等内容,便于用户根据需求选择合适的工具。
317 36
|
2月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
2月前
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能

热门文章

最新文章

推荐镜像

更多