Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 从图像中提取位代码_Image_Image Processing_Bit_Optical Mark Recognition - Fatal编程技术网

Image 从图像中提取位代码

Image 从图像中提取位代码,image,image-processing,bit,optical-mark-recognition,Image,Image Processing,Bit,Optical Mark Recognition,我在一个项目中工作,从图像中重新识别位代码,例如,黑色矩形表示0位,白色(空白,不可见)表示1位 有人知道如何处理图像来提取这些信息吗?我的项目是用jav编写的,但任何解决方案都是可以接受的。 万分感谢 谢谢大家的支持。 我不是图像处理专家,我尝试使用Canny边缘检测器实现应用边缘检测,免费java实现find。我使用了这个完整的图像[http://img257.imageshack.us/img257/5323/colorimg.png],减小它(比例因子=0.4)以进行快速处理,这就是结

我在一个项目中工作,从图像中重新识别位代码,例如,黑色矩形表示0位,白色(空白,不可见)表示1位

有人知道如何处理图像来提取这些信息吗?我的项目是用jav编写的,但任何解决方案都是可以接受的。 万分感谢


谢谢大家的支持。 我不是图像处理专家,我尝试使用Canny边缘检测器实现应用边缘检测,免费java实现find。我使用了这个完整的图像[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。
非常感谢支持。

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

编辑:

进行边缘检测也可能是富有成效的。首先应用一种边缘检测方法,比如维基百科上的一些东西。我使用了archive.alwaysmovefast.com/basic-edge-detection-in-python.html上的一个。然后将任何小于180的灰度值(如果希望框更暗,请增加此值)转换为黑色,否则将其完全变为白色。然后创建边界框,即像素全部为白色的线条。如果数据没有严重倾斜,那么这应该可以很好地工作,否则您可能需要做更多的工作。有关结果,请参见此处:

编辑2:

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

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

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

编辑:

进行边缘检测也可能是富有成效的。首先应用一种边缘检测方法,比如维基百科上的一些东西。我使用了archive.alwaysmovefast.com/basic-edge-detection-in-python.html上的一个。然后将任何小于180的灰度值(如果希望框更暗,请增加此值)转换为黑色,否则将其完全变为白色。然后创建边界框,即像素全部为白色的线条。如果数据没有严重倾斜,那么这应该可以很好地工作,否则您可能需要做更多的工作。有关结果,请参见此处:

编辑2:

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

如果您以以下方式对bin进行预处理,则可以应用前面的分割方法,在这种情况下,您只需要在一些训练样本之后计算黑色或白色像素的数量和阈值。
这是识别好的旧的OMR(光学标记识别)

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

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

简单情况:图像无歪斜,无拉伸或收缩

创建图像的水平和垂直轮廓。i、 e.汇总所有列和所有行中的值,并存储在数组中。对于MxN(宽x高)的图像,水平剖面中有M个单元格,垂直剖面中有N个单元格

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

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

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

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

案例3:拉伸或收缩


与1基本相同,但噪声更高,可靠性更低。

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

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

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

简单情况:图像无歪斜,无拉伸或收缩

创建图像的水平和垂直轮廓。i、 e.汇总所有列和所有行中的值,并存储在数组中。对于MxN(宽x高)的图像,水平剖面中有M个单元格,水平剖面中有N个单元格