Вы можете попробовать сочетание фильтров Sobel (для тонких кромок) и гауссовских фильтров (чтобы размыть изображение).
Вы не указать, какой API используется для обработки изображений в Java, и, как я не знаком с Tess4J я покажу, что можно сделать из Python (вы можете использовать предпочтительную библиотеку для работы с изображениями в Java, процесс будет тем же самым):
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)
Это будет генерировать следующие изображения:
IMG_2.jpg
img_3.jpg
Вы можете попробовать с обоими типами изображений, чтобы определить, что дает хорошие результаты с Tess4J, вполне возможно, что вам не нужно, чтобы размыть изображение после прореживания края, поскольку числа можно распознать более легко.
Если после этого вы хотите, вы можете попробовать прореживать все цифры до тех пор, пока они не будут иметь 1 пиксель. Может быть, это хорошо работает с Tess4J.
Одна вещь об использовании гауссовой фильтрации заключается в том, что вы делаете небольшие функции, такие как десятичная точка, сложнее обнаружить. –
Это правда, когда я писал это, я думал о том, как увеличить расстояние между точкой и 4 до применения гаусса, но я не мог придумать хороший способ, который не включал пороговое значение. Может быть, более разумное обнаружение границы? – MondKin