我的问题简述如下:在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()
输入图像:
输出图表:
基于这个分布,我现在想识别曲线中具有规律波浪形模式的区域,这些模式在图表的前三分之一和后三分之一处可见(粗略来说)。其他人对如何处理这项任务有何建议?
起初,我尝试对整个一维分布进行线性模型拟合,但由于各种原因失败了。现在我认为可能有意义的是尝试对曲线的某些部分拟合类似正弦波的模型,但这似乎有些过头。其他人对如何最好地处理这项任务有何建议?任何建议或见解都将非常受欢迎!
回答:
这并没有回答你的问题,但可能解决了你的问题。平滑行总和隐藏了一个事实,即图像中的文本行被白色空间很好地分隔开——这对于活动字体印刷来说是预期的现象。
你可以使用白色空间作为分隔符,将图像分成块。在大多数情况下,一个块对应于一行。非常大的块对应于图像。