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顽固行为,然后在末尾减去填充。这甚至适用于一位数字!
不过,为什么您要对一个数字执行反向例程对我来说还是个谜。但是为了完整起见,我什至使它适用于零和一的输入,这通常会中断,因为底日志不会为它们返回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