【问题标题】:Python: Identifying undulating patterns in 1d distributionPython:识别一维分布中的波动模式
【发布时间】:2018-01-28 21:15:20
【问题描述】:

我的问题很简单:给定 Python 中的一维分布,如何识别该分布中具有类似正弦的波动模式的区域?

我正在努力识别历史文档页面扫描中的图像。这些图像在扫描中基本上总是全角的(也就是说,它们基本上从不与文本并列)。这使我相信最简单的解决方案是删除页面扫描中包含文本行的区域。

使用以下 sn-p,可以将图像读入内存并测量图像中每一行的聚合像素亮度,从上到下,将输入图像转换为下图:

import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.ndimage import imread
import numpy as np
import sys

img = 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 array
window_size = 150
running_average_y = np.convolve(row_sums, np.ones((window_size,))/window_size, mode='same')

# plot the y dimension pixel distribution
plt.plot(running_average_y)
plt.show()

输入图片:

输出图:

鉴于这种分布,我现在想要识别曲线区域,这些区域具有人们在绘图的前三分之一和后三分之一中看到的规则波动模式(粗略地说)。其他人对如何完成这项任务有想法吗?

起初我尝试将线性模型拟合到整个一维分布,但由于各种原因失败了。我现在认为尝试将正弦波之类的东西拟合到曲线段可能是有意义的,但这似乎有点矫枉过正。其他人是否对如何最好地完成这项任务有想法?任何建议或见解将不胜感激!

【问题讨论】:

  • 您可能想在dsp.stackexchange.com询问
  • DTFTWavelet transform这样的分段频域?不是专家,但似乎有帮助。
  • 愿你想做适合顺序的样条拟合。
  • 所有图片都有黑框吗?如果您不通过卷积进行平滑处理,则该框架非常明显。

标签: python opencv numpy machine-learning classification


【解决方案1】:

这并不能回答您的问题,但也许可以解决您的问题。 平滑行总和隐藏了图像中的文本行被空白很好地分隔的事实 - 正如可移动字体打印所预期的那样。

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

import sys
import numpy as np
import matplotlib.pyplot as plt

MIN_BLOCK_SIZE = 100 # pixels

img = plt.imread(sys.argv[1])

# find blank rows
row_sums = np.mean(img, axis=1)
threshold = np.percentile(row_sums, 75)
is_blank = row_sums > threshold

# find blocks between blank rows
block_edges = np.diff(is_blank.astype(np.int))
starts, = np.where(block_edges == -1)
stops, = np.where(block_edges == 1)
blocks = np.c_[starts, stops]

# plot steps
fig, axes = plt.subplots(3,1, sharex=True, figsize=(6.85, 6))
axes[0].plot(row_sums)
axes[0].axhline(threshold, c='r', ls='--')
axes[1].plot(is_blank)
for (start, stop) in blocks:
    if stop - start > MIN_BLOCK_SIZE:
        axes[2].axvspan(start, stop, facecolor='red')
plt.show()

【讨论】:

  • 这太棒了!在发布我的问题后,我意识到我有 OCR 数据可以识别图像中每个已识别单词的边界框,因此可以从像素矩阵中减去这些数据并快速找到生成的图像,但是您的方法更好,因为它没有需要 OCR 数据。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2014-05-15
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 2015-12-06
相关资源
最近更新 更多