【问题标题】:Detect angle of a black & white halftone screen检测黑白半色调屏幕的角度
【发布时间】:2014-08-07 04:43:08
【问题描述】:

有一个 1 位黑白半色调图像作为输入,我需要提取用于定位点的角度,如下例所示:

我的意图是识别低于某个阈值的所有孤立区域(我可以假设所有点都在 20x20 区域中)并列出这些点的所有中心点。第二步是对这些特定点进行霍夫变换以找到有趣的角度。主要问题是这似乎产生了很多点,使得霍夫变换 (i) 变慢并且 (ii) 给出误报,需要依次过滤掉。

我不禁觉得我把事情复杂化了,我忽略了一个简单而优雅的解决这个问题的方法。我可能忽略了哪些想法或方法?

【问题讨论】:

  • 简单思路:获取所有黑白小圆的中心坐标。
  • 有趣的问题 - 尝试谷歌搜索“去筛选算法”。这个方法看起来很有趣google.co.uk/…
  • 我会研究这些出版物。大多数似乎都非常依赖过滤,没有考虑点的角度。
  • 只是一个小问题:上面的图像不是一个 1 位 BW 图像,而是一个下采样的灰度图像,上面画了一些线条。
  • 是的,抱歉,我在 photoshop 中对其进行了编辑以添加线条并缩小了一点以显示我的意图问题。

标签: c++ algorithm image-processing


【解决方案1】:

这只是一个想法,我实际上没有尝试过:

  • 运行腐蚀,直到每个点留下 1 个像素
  • 用线将每个点与最近的点连接起来(我的意思是,只记住线的参数,不要画它)
  • 连接几个点后(取决于您找到最佳数量),您应该能够平均连接点的线的角度

【讨论】:

  • 看看侵蚀的想法,这也应该能够隔离已经附着在其邻居上的点,这将解决很多问题。将做一些实验并报告。
【解决方案2】:

FFT

尝试对图像进行傅里叶变换。屏幕会产生非常尖锐的频率峰值。有了这些峰值,即使是嘈杂的图像,您也可以非常准确地获得屏幕频率和角度。

我刚刚将您的图像转换回灰度图像:

然后我在它上面运行 2D fft:

(20,27) 处的亮点及其镜像位置是非常强的峰值,比图像中的其他任何东西都要强几个数量级。这条曲线显示了第 20 行的功率谱:

因此,y 方向的屏幕频率约为 193/20 = 9.7 像素(图像高度 193),x 方向的屏幕频率约为 263/27 = 9.7 像素。这是每个方向上的点间距离,通常需要一点三角函数来计算轴。如果需要,可以通过使用峰值周围的区域从傅里叶功率谱中更准确地插值峰值位置。峰也可以相互折叠以减少噪音。

性能?

FFT 是一种相当快速的计算转换(至少与 Hough 等人相比),但对于大图像,它需要大量的空间和时间。您可以在几个较小的区域(例如 10 个点)上使用它,这也有助于您在屏幕不均匀的情况下使用它。至少在那种情况下它会很快。在我的电脑上运行一个 128x128 像素的 2D FFT 需要 418 us。

关于 FFT 的说明

不熟悉傅立叶变换的读者应该知道,我在上面和 cmets 中使用了一些草率的语言。变换本身就是“傅里叶变换”,FFT 只是一种算法(事实上图像处理中的标准)来执行离散傅里叶变换 (DFT)。

在计算 FFT 并将结果与​​文献进行比较时,容易混淆的一件事是图像中零频率的位置。在大多数教科书中,零频率(实际上是图像像素值的总和)位于图像的中心。大多数 FFT 库将零频率放在左上角(如我的示例所示)。

因此,在教科书中,零频率分量通常靠近变换图像的中心。对于大多数 FFT 库,低频靠近图像的每个角落。 (通常有像fftshift这样名称的函数来在这两种表示之间进行转换。)

FT 是一个复杂的变换。如果对实值信号(例如单个图像)进行变换,则得到的变换图像中会有很多对称性。这通常不是很重要,但有时可以用来加快速度或节省一些内存。

一维 FFT 的复杂度为 O(n log n)。在二维情况下,首先对每一列运行 FFT,然后对每一行运行,因此为 O(xy log y + yx log x) = O(xy (log x + log y)) 或 O(n^2 log n) 用于正方形图像。现代计算机的 FFT 速度非常快(并且可以通过使用 GPU 进一步提升),但是每个方向都有数千个点的大型 FFT 是使用错误算法的警告信号。

【讨论】:

  • 我是傅立叶变换的新手,因此我还没有考虑过它,但我一定会进一步研究并做一些实现。从 x 和 y 频率推导出实际频率和角度应该是微不足道的。非常感谢您提供这些信息!
  • 您应该旋转和倾斜图像以查看 FFT 峰的行为。这在实践中很简单,但很难解释。如果要对频率峰值进行插值,可以通过功率谱对数中的抛物线来近似峰值。 (当心,不要试图为那个找到数学上的理由,它只是工作......)如果你需要一个 fft 库,fftw 是最常见的。
  • @DrV 这是一个非常好的答案,您介意我问您是否有参考资料或书籍可以让我了解有关如何使用 FFT 和图像应用程序的更多信息?跨度>
  • @CaptainCodeman 谢谢。我的建议是您从使用“傅立叶变换图像处理”一词的搜索引擎开始。有越来越多的数学解释供您选择,具体取决于您对数学的适应程度。如果您不熟悉一维傅立叶变换,则首先尝试学习它可能会有所帮助。并获得 Matlab、Pylab 或类似的东西,以便您可以轻松地进行实验。我还将在我的答案中添加一些关于 FFT 的进一步 cmets。
  • @CaptainCodeman 当您了解基础知识并有基本的了解时,您可能最适合上网。有很多好的和很多坏的例子,你会从两者中学习。注意窗口函数,在示例中通常没有很好地涵盖。此外,如果您的图像中有不规则的网格,则 FT 不是一个好工具。图像处理中的大多数 FT 应用程序都是简单的卷积滤波器,图像分析(如在这个问题中)并不经常执行。为了基本了解,请务必先了解 1D 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
相关资源
最近更新 更多