Mathematica, modulo yok!
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]]]]
Yıkalım.
Öncelikle, sayıdaki kaç rakam olduğunu bulmak için bazı "yaratıcı aritmetik" kullanırız: length = Ceiling[Log[10, n]];
Ardından, sayıyı güzel ve büyük bir resme Rasterleştiriyoruz:
Şimdi o görüntünün sınırlayıcı kutusunu sorguluyoruz ve genişliği ve yüksekliği dolduruyoruz (aslında görüntü yüksekliği yerine görüntü taban çizgisi uzaklığını kullanıyoruz, çünkü MM görüntüdeki taban çizgisinin altına biraz boşluk ekler).
Daha sonra, NestList, ImageTake'in görüntünün sonundan karakterleri tek tek toplamasını sağlamak için dizenin uzunluğuna bölünerek görüntünün genişliğini tekrar tekrar çıkarır ve bunlar bu görüntüye ImageAssemble tarafından yeniden birleştirilir:
Daha sonra, bu görüntü boyutunda ve rasterleştirme kalitesinde nihai çıktıyı kusursuz bir şekilde tanıyabilen ve bize tamsayı veren optik karakter tanıma için TextRecognize işlevine geçiyoruz:
72641
Logaritmalar ve OCR - Çikolata ve fıstık ezmesi gibi!
Yeni ve geliştirilmiş
Bu sürüm, TextRecognise'ın küçük sayılarla ilgili davranışını engellemek için sayıyı dağıtır ve ardından pedi sonunda çıkartır. Bu tek haneli sayılar için bile işe yarar!
Yine de, neden tek bir numara üzerinde ters rutin çalıştırıyor olmanız benim için gizemli. Ama sadece tamlık uğruna, sıfır ve bir girdiler için bile çalışmasını sağladım, bu normalde kırılacaktı çünkü kütük kütük onlar için 1 döndürmedi.
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