Mathematica, 모듈로 없음!
n = 14627;
length = Ceiling[Log[10, n]];
img = Rasterize[n, RasterSize -> 400, ImageSize -> 400];
box = Rasterize[n, "BoundingBox", RasterSize -> 400, ImageSize -> 400];
width = box[[1]]; height = box[[3]];
ToExpression[
TextRecognize[
ImageAssemble[
ImageTake[img, {1, height}, #] & /@
NestList[# - width/length &, {width - width/length, width},
length - 1]]]]
그것을 분해하자.
먼저 "창의적인 산술"을 사용하여 숫자에 몇 자릿수가 있는지 알아 봅니다. length = Ceiling[Log[10, n]];
다음으로 숫자를 멋진 큰 이미지로 래스터 화합니다.
이제 이미지의 경계 상자를 쿼리하고 너비와 높이를 채 웁니다 (실제로는 이미지 높이 대신 기준선 오프셋을 사용합니다. MM은 이미지에서 기준선 아래에 공백을 추가하기 때문에).
다음으로 NestList는 이미지의 너비를 문자열의 길이로 재귀 적으로 빼서 ImageTake가 이미지의 끝에서 문자를 하나씩 뽑아 내고 ImageAssemble에 의해이 이미지로 다시 어셈블 할 수있게합니다.
그런 다음 광학 문자 인식을 위해 TextRecognize 함수에 전달합니다.이 이미지 크기와 래스터 화 품질은 최종 출력을 완벽하게 인식하고 정수를 제공 할 수 있습니다.
72641
대수 및 OCR-초콜릿과 땅콩 버터와 같습니다!
새롭고 개선 된
이 버전은 TextRecognize의 고집스러운 동작을 처리하기 위해 숫자를 채우고 작은 숫자를 뺍니다. 심지어 한 자리 숫자에서도 작동합니다!
그럼에도 불구하고 왜 단일 번호에서 역순으로 실행해야하는지는 미스터리입니다. 그러나 완전성을 위해 0과 1의 입력에 대해서도 작동하도록 만들었습니다. 바닥 로그가 1을 반환하지 않기 때문에 일반적으로 중단됩니다.
n = 1;
pad = 94949;
length = If[n == 1 || n == 0, 1, Ceiling[Log[10, n]]];
img = Rasterize[n + (pad*10^length), RasterSize -> 400,
ImageSize -> 400];
padlength = length + 5;
box = ImageDimensions[img];
width = box[[1]]; height = box[[2]];
reversed =
ImageResize[
ImageAssemble[
ImageTake[img, {1, height}, #] & /@
NestList[# - width/padlength &, {width + 1 - width/padlength,
width}, padlength - 1]], 200];
recognized = ToExpression[TextRecognize[reversed]];
(recognized - pad)/10^5