1

我有一个带有一组边缘(线)的二值化位图,类似于下图所示

在此处输入图像描述

  1. 平滑而笔直的部分。
  2. 具有高频噪声、非连接元素(浮动像素)并且有时会损坏的直线段。
  3. 具有 2 个重要方向变化的平滑线。
  4. 在方向和高频噪声方面有 2 个重要变化的片段。

这些边缘是图像上某些区域的边界,我需要测量这些边缘的质量(用于分割目的)。此测量应返回 2 个因素:

  • 高频噪声
  • 细分方向的重大变化。

因此,对于上面的示例,测量结果应返回:

  1. 低高频噪音 - 0 次变化。
  2. 高高频噪声 - 0 次变化。
  3. 低高频噪音 - 2 种变化。
  4. 高高频噪音 - 2 种变化。

对于每个给定的图像,已经知道哪些像素属于每个片段。我没有连接元素(像素)的图表,只有位图。如果可能,尽量避免创建一个。

该算法应该很快,因此速度比准确性更重要(合理的近似值就可以了)

我可以使用什么样的方法来执行这种测量?

4

1 回答 1

1

我只对噪声测量有一个想法。

我假设有一个只有一个段的位图图像,图像有白色像素,第 -th 像素N的坐标(行,列)是,从到。i(r[i],c[i])i1N

计算段边界框的高度和宽度:边界框是一个边平行于 x,y 框架的矩形;边界框有

width = c_max - c_min

它有

height = r_max - r_min

在哪里:

c_minc[i]i1到的最小值N

c_maxc[i]i1到的最大值N

r_minr[i]i1到的最小值N

r_maxr[i]i1到的最大值N

我希望一条没有噪声的线由大致等于边界框对角线长度的像素数组成:

N_diagonal = sqrt( width*width + height*height )

现在你必须比较NN_diagonal如果N/N_diagonal接近 1,则噪音低,离N/N_diagonal1 越远,噪音越高。如果N/N_diagonal非常高,则与表示线条所需的最小像素数相比,您有很多白色像素。另一方面,如果N/N_diagonal非常低,则图像上可能只有一些白色像素,根本没有片段。所以基本上你需要两个阈值,你可以用你的可用图像进行一些实验来调整它们;我将从以下内容开始:

N/N_diagonal < 0.95: 像素不够

0.95 <= N/N_diagonal <= 1.05: 低噪声

1.05 < N/N_diagonal: 高噪音

对于算法的时间性能:在我看来,该算法是 O( N·) 来找到边界框的宽度和高度,然后你有一些浮点运算来计算对角线和噪声测量。

如果对角线近似不够,那么您可以通过更多努力获得更好的估计,例如查看Bresenham's line algorithm

于 2013-11-19T20:23:30.353 回答