基于Tesseract/Java的七段数字数据识别

基于Tesseract/Java的七段数字数据识别,java,tesseract,image-recognition,tess4j,seven-segment-display,Java,Tesseract,Image Recognition,Tess4j,Seven Segment Display,我正在尝试使用tess4J从图像中识别七段数字文本 我的意见在这里 我做了一些规范化,如下所示 1]图像已裁剪 2]将其转换为二进制文件 我希望从图像中删除文本的锯齿状边缘。我如何才能做到这一点 我尝试了GitHub的不同traineddata。但没有什么能如我所愿 如何手动创建培训数据 我期待着您的宝贵建议,并提前表示感谢 您可以尝试Sobel滤镜(用于细化边缘)和高斯滤镜(用于模糊图像)的组合 您没有指定在Java中用于图像处理的API,由于我不熟悉Tess4J,我将展示Python可

我正在尝试使用tess4J从图像中识别七段数字文本

我的意见在这里

我做了一些规范化,如下所示

1]图像已裁剪

2]将其转换为二进制文件

我希望从图像中删除文本的锯齿状边缘。我如何才能做到这一点

我尝试了GitHub的不同traineddata。但没有什么能如我所愿

如何手动创建培训数据


我期待着您的宝贵建议,并提前表示感谢

您可以尝试Sobel滤镜(用于细化边缘)和高斯滤镜(用于模糊图像)的组合

您没有指定在Java中用于图像处理的API,由于我不熟悉Tess4J,我将展示Python可以实现的功能(您可以使用首选库在Java中进行图像处理,过程将是相同的):

导入scipy
导入scipy.misc
导入scipy.ndimage.filters
进口numpy
def保存图像(img_数据、计数器):
img_fn=“img{}.jpg”。格式(计数器)
scipy.misc.imsave(img\U fn,img\U数据)
如果名称=“\uuuuu main\uuuuuuuu”:
#这将加载帖子的第二个图像
img_0=scipy.misc.imread(“TqO53.jpg”)
img_0=scipy.平均值(img_0,-1)
#保存图像(img\u 0,0)
#获得优势
img_x=scipy.ndimage.filters.sobel(img_0,0)
img_y=scipy.ndimage.filters.sobel(img_0,1)
img_1=numpy.hypot(img_x,img_y)
#保存图像(img\u 1,1)
#从原始图像中删除边(即细化边)
img_2=img_0-img_1
img_2[img_2<10]=0
保存图像(img_2,2)
#模糊图像,如果你想摆脱粗略的边界
img_3=scipy.ndimage.gaussian_滤波器(img_2,sigma=1)
保存图像(img_3,3)
这将生成以下图像:

img_2.jpg

img_3.jpg

您可以尝试使用这两种类型的图像来确定使用Tess4J时哪种图像效果好,在细化边缘后可能不需要模糊图像,因为数字更容易识别


如果之后需要,可以尝试将整数细化到1像素厚。也许这对Tess4J很有效

使用高斯滤波的一点是,你会使小数点这样的小特征更难检测。的确,在写这篇文章时,我在考虑如何在应用高斯滤波之前增加点和4之间的间隔,但我想不出一个不涉及阈值的好方法。也许是更明智的边界检测?
import scipy
import scipy.misc
import scipy.ndimage.filters
import numpy

def save_image(img_data, counter):
    img_fn = "img_{}.jpg".format(counter)
    scipy.misc.imsave(img_fn, img_data)


if __name__ == "__main__":
    # This loads the second image of your post
    img_0 = scipy.misc.imread("TqO53.jpg")
    img_0 = scipy.average(img_0, -1) 
    #save_image(img_0, 0)

    # Obtain edges
    img_x = scipy.ndimage.filters.sobel(img_0, 0)
    img_y = scipy.ndimage.filters.sobel(img_0, 1)
    img_1 = numpy.hypot(img_x, img_y)
    #save_image(img_1, 1)

    # Remove edges from original image (i.e. thinning edges)
    img_2 = img_0 - img_1
    img_2[img_2 < 10] = 0 
    save_image(img_2, 2)

    # Blur image if you want to get rid of the sketchy borders
    img_3 = scipy.ndimage.gaussian_filter(img_2, sigma=1)
    save_image(img_3, 3)