从图像中提取位代码

时间:2010-12-18 12:32:26

标签: image image-processing bit optical-mark-recognition

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

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


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

3 个答案:

答案 0 :(得分:1)

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

解决方案取决于您获得的数据的质量和一致性,因此噪音非常重要。

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

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

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

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

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

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

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

案例3:拉伸或缩小

与1非常相似,但噪音更高,可靠性更低。

答案 1 :(得分:0)

我不熟悉Java,但在Python中,您可以使用映像库打开图像。然后加载高度和宽度,并相应地按照高度/行和宽度/列将图像分割成网格。然后,只需查看这些区域中的黑色像素,或任何颜色的PIL寄存器即黑色。这显然依赖于数据的网格性质。

编辑:

进行边缘检测也可能很有成效。首先应用维基百科的边缘检测方法。我使用了archive.alwaysmovefast.com/basic-edge-detection-in-python.html上找到的那个。然后将小于180的任何灰度值(如果您希望盒子更暗,只需将此值增加)转换为黑色,否则将其变为完全白色。然后创建边界框,像素全部为白色的线条。如果数据不是非常倾斜,那么这应该可以很好地工作,否则你可能需要做更多的工作。请点击此处查看结果:http://imm.io/2BLd

EDIT2:

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

alt text

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

答案 2 :(得分:0)

Aliostad发表了一些好评。

这是OMR,您会发现通过良好的图像处理库获得良好的一致性结果会更容易。 www.leptonica.com是一个免费的开源“C”库,是一个非常好的起点。它可以为您处理偏斜和阈值处理任务。阈值到B / W将是一个良好的开端。

另一种选择是IEvolution - 用于.NET的http://www.hi-components.com/nievolution.asp

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