Python: 在一维分布中识别波浪形模式

我的问题简述如下:在Python中,给定一个一维分布,如何识别该分布中具有类似正弦波的波浪形模式的区域?

我正在尝试在历史文档的页面扫描中识别图像。这些图像在扫描中几乎总是占据整个宽度(也就是说,它们几乎从不与文本并排)。这让我认为最简单的解决方案是移除页面扫描中包含文本行的区域。

使用以下代码片段,可以将图像读取到内存中,并测量图像中每一行的像素亮度总和,从上到下,将输入图像转换为下面的图表:

import matplotlib.mlab as mlabimport matplotlib.pyplot as pltfrom scipy.ndimage import imreadimport numpy as npimport sysimg = imread(sys.argv[1])row_sums = list([(sum(r)/len(r)) for r in img ])# the size of the returned array = size of row_sums input arraywindow_size = 150running_average_y = np.convolve(row_sums, np.ones((window_size,))/window_size, mode='same')# plot the y dimension pixel distributionplt.plot(running_average_y)plt.show()

输入图像:

enter image description here

输出图表:

enter image description here

基于这个分布,我现在想识别曲线中具有规律波浪形模式的区域,这些模式在图表的前三分之一和后三分之一处可见(粗略来说)。其他人对如何处理这项任务有何建议?

起初,我尝试对整个一维分布进行线性模型拟合,但由于各种原因失败了。现在我认为可能有意义的是尝试对曲线的某些部分拟合类似正弦波的模型,但这似乎有些过头。其他人对如何最好地处理这项任务有何建议?任何建议或见解都将非常受欢迎!


回答:

这并没有回答你的问题,但可能解决了你的问题。平滑行总和隐藏了一个事实,即图像中的文本行被白色空间很好地分隔开——这对于活动字体印刷来说是预期的现象。

你可以使用白色空间作为分隔符,将图像分成块。在大多数情况下,一个块对应于一行。非常大的块对应于图像。

enter image description here

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注