1

我正在一个项目中从这样的图像中重新调整位代码其中黑色矩形表示 0 位,白色(空白,不可见)1 位。

有人有任何想法来处理图像以提取这些信息吗?我的项目是用 jav 编写的,但可以接受任何解决方案。预先感谢。


感谢大家的支持。我不是图像处理方面的专家,我尝试使用 Canny 边缘检测器实现来应用边缘检测,免费的 java 实现在这里找到。我使用了这张完整的图像 [http://img257.imageshack.us/img257/5323/colorimg.png],缩小它(比例因子 = 0.4)以进行快速处理,这就是结果 [http://img222.imageshack .us/img222/8255/colorimgout.png]。现在,我如何解码具有 0 位值的白色矩形,而没有 1 的矩形?图像有 10 行 X 16 列。我不使用 python,但我可以尝试将其转换为 Java。非常感谢支持。

4

3 回答 3

1

这是识别良好的旧OMR(光学标记识别)

解决方案因您获得的数据的质量和一致性而异,因此噪声很重要。

使用图像处理库显然会有所帮助。

简单案例:图像无歪斜,无拉伸或收缩

创建图像的水平和垂直轮廓。即总结所有列和所有行中的值并存储在数组中。对于 MxN(宽 x 高)的图像,您将在水平轮廓中有 M 个单元格,在垂直轮廓中有 N 个单元格。

使用阈值来找出哪些单元格是白色的(空的),哪些是黑色的。这假设您将在每行或每列中至少获得几个条目。因此,黑色单元格将定义一个感兴趣的位置(您会期望标记的位置)。

基于此,您可以在表格中定义菱形并获得菱形的坐标(有标记的矩形),然后只需将每个菱形中的像素值相加并根据数字,您可以定义它是否有标记或不是。

案例 2:倾斜(图像中倾斜)

使用傅立叶 (FFT) 找到倾斜值,然后对其进行变换。

案例 3:拉伸或收缩

几乎与 1 相同,但噪音更高,可靠性更低。

于 2010-12-18T12:54:54.137 回答
0

Aliostad 发表了一些很好的评论。

这是 OMR,您会发现使用良好的图像处理库更容易获得良好的一致结果。www.leptonica.com 是一个免费的开源“C”库,是一个很好的起点。它可以为您处理偏差和阈值任务。将阈值设置为 B/W 将是一个好的开始。

另一种选择是 IEvolution - http://www.hi-components.com/nievolution.asp for .NET。

要取得成功,您将需要某种类型的参考/注册标记以允许倾斜和拉伸,尤其是在您使用文档扫描或从相机图像捕获时。

于 2010-12-19T12:50:47.477 回答
0

我对Java不熟悉,但是在Python中,你可以使用成像库来打开图像。然后加载高度和宽度,并根据高度/行和宽度/列将图像分割成一个网格。然后,只需在这些区域中查找黑色像素,或者 PIL 记录该黑色的任何颜色。这显然依赖于数据的网格性质。

编辑:

做边缘检测也可能是富有成效的。首先应用类似于维基百科的边缘检测方法。我使用了在 archive.alwaysmovefast.com/basic-edge-detection-in-python.html 找到的那个。然后将任何小于 180 的灰度值(如果您想让框变暗,只需增加该值)转换为黑色,否则将其变为完全白色。然后创建边界框,即像素全为白色的线。如果数据不是非常偏斜,那么这应该工作得很好,否则你可能需要做更多的工作。结果见这里:http: //imm.io/2BLd

编辑2:

Denis,你的数据集有多大,图像有多大?如果您有数千张这样的图像,那么手动删除边框(红色背景和黄色条)是不可行的。我认为在继续之前了解这一点很重要。此外,我认为 prewitt 边缘检测在这种情况下可能会更有用,因为噪音似乎更少:

替代文字

可以应用之前的分割方法,如果您按照以下方式对bin进行预处理,则只需在一些训练样本后计算黑色或白色像素的数量和阈值即可。 替代文字

于 2010-12-18T12:53:09.997 回答