একটি চিত্র থেকে 2014 নম্বর উত্পাদন করুন


11

ইন 2014 চ্যালেঞ্জ , মাইকেল স্টার্ন বিশ্লেষণ করতে OCR ব্যবহার করে প্রস্তাব দেওয়া 2014 নম্বর একটি চিত্র2014. আমি একটি ভিন্ন দিক এই চ্যালেঞ্জ নিতে চাই। আপনার পছন্দের ভাষা / স্ট্যান্ডার্ড লাইব্রেরি থেকে অন্তর্নির্মিত ওসিআর ব্যবহার করে, ক্ষুদ্রতম চিত্র (বাইটে) ডিজাইন করুন যা ASCII স্ট্রিং "2014" এ পার্স করা হয়েছে।

স্টারনের আসল চিত্রটি 7357 বাইট, তবে কিছুটা চেষ্টা করে এটি নিরবচ্ছিন্নভাবে 980 বাইটে সংকুচিত করা যেতে পারে। সন্দেহ নেই যে কালো-সাদা সংস্করণ (181 বাইট) একই কোড সহ কাজ করে।

বিধি: প্রতিটি উত্তরে চিত্রটি দেওয়া উচিত, এটির আকার বাইটে এবং প্রসেসের জন্য প্রয়োজনীয় কোডটি দেওয়া উচিত। সুস্পষ্ট কারণে কোনও কাস্টম ওসিআর অনুমোদিত নয় ...! যে কোনও যুক্তিসঙ্গত ভাষা এবং চিত্র বিন্যাস অনুমোদিত allowed

সম্পাদনা: মন্তব্যের জবাবে আমি যে কোনও ওসিআর উপলভ্য নয় এমন ভাষাগুলির জন্য যেকোন প্রাইসিং লাইব্রেরি বা এমনকি http://www.free-ocr.com/ অন্তর্ভুক্ত করার জন্য এটি সম্প্রসারিত করব ।


9
ওসিআর অন্তর্নির্মিত কতটি ভাষা বা স্ট্যান্ডার্ড গ্রন্থাগার রয়েছে? অথবা আপনি কি "স্ট্যান্ডার্ড লাইব্রেরি" এর অর্থ এখানে "এমন কোনও গ্রন্থাগার যা এই চ্যালেঞ্জটির জন্য বিশেষভাবে তৈরি করা হয়নি"?
পিটার টেলর

3
গাণিতিক ছাড়া অন্য কোনও প্ল্যাটফর্মের ওসিআর অন্তর্নির্মিত আছে কি?
মাইকেল স্টারন

আপনার মানসম্মত হওয়া উচিত, " free -ocr.com ব্যবহার করুন " বা অন্য কোনও সহজে অ্যাক্সেসযোগ্য ocr এর মতো কিছু বলুন ।
জাস্টিন 16

উত্তর:


10

শেল (চিত্রম্যাগিক, টেসারেক্ট), 18 বাইট

file=golf_2014
echo -n UDQKMTMgNQruqCqo6riKiO6I | base64 -d > $file.pbm
convert -border 2x2 -bordercolor white -resize 300% -sharpen 0 -monochrome $file.pbm $file.png
tesseract $file.png $file digits
cat $file.txt
rm $file.pbm $file.png $file.txt

চিত্রটি 18 বাইট এবং এটি পুনরুত্পাদন করা যেতে পারে:

echo -n UDQKMTMgNQruqCqo6riKiO6I | base64 -d > 2014.pbm

দেখে মনে হচ্ছে এটি (এটি পিএনজি অনুলিপি, মূল নয়):

2014

ইমেজম্যাগিকের সাথে প্রক্রিয়া করার পরে, এটি দেখতে এটির মতো দেখাচ্ছে:

2014 বড়

ইমেজম্যাগিক সংস্করণ 6.6.9-7, পরীক্ষামূলক সংস্করণ 3.02 ব্যবহার করে। পিবিএম চিত্রটি গিম্পে তৈরি হয়েছিল এবং একটি হেক্স সম্পাদক দ্বারা সম্পাদিত হয়েছিল।


এই সংস্করণটির প্রয়োজন jp2a

file=golf_2014
echo -n UDQKMTMgNQruqCqo6riKiO6I | base64 -d > $file.pbm
convert -border 2x2 -bordercolor white -resize 300% -sharpen 0 -monochrome $file.pbm $file.png
tesseract $file.png $file digits
cat $file.txt
convert -background black -fill white -border 2x2 -bordercolor black -pointsize 100 label:$(cat $file.txt) $file.jpg
jp2a --chars=" $(cat $file.txt) " $file.jpg
rm $file.pbm $file.png $file.txt $file.jpg

এটি এরকম কিছু তৈরি করে:

    2014444444102         01144444102              214441                 214441     
   1             1      24           1            04    4                0     4     
  1    410201     0    0    410004    1       2014      4              21      4     
 24   42     0    4    4    0     1    0    24          4             04       4     
  22222      1    1   0    42     0    4    2   4100    4            1   41    4     
            1    42   0    4      2     2   2412   0    4          24   420    4     
          04    42    0    1      2     2          0    4         0   40  0    4     
       204    42      0    1      2     2          0    4       24   42   0    4     
     21     12        0    4      0    42          0    4      2     411114     1112 
    04   412          24    0     1    0           0    4      0                   0 
  24     1111111110    1    42  21    4            0    4      200011111001    40002 
  4               4     04    44     42            0    4                 0    4     
 0                4      214       10              0    4                 0    4     
  22222222222222222         222222                  22222                  22222     

খুব, খুব চিত্তাকর্ষক। শিরোনামের জন্য 3 বাইট, চিত্রের মাত্রার জন্য 5 বাইট, বিটম্যাপের জন্য 10 বাইট by ফর্ম্যাটটি এখানে বর্ণিত হয়েছে: netpbm.sourceforge.net/doc/pbm.html
চার্লস

5

জাভা + টেসারেক্ট, 53 বাইট

যেহেতু আমার কাছে ম্যাথমেটিকা ​​নেই, তাই আমি নিয়মগুলি কিছুটা বাঁকিয়ে ওসিআর করানোর জন্য টেসারেক্ট ব্যবহার করার সিদ্ধান্ত নিয়েছি । আমি একটি প্রোগ্রাম লিখেছিলাম যা বিভিন্ন ফন্ট, আকার এবং শৈলী ব্যবহার করে একটি চিত্রকে "2014" রেন্ডার করে এবং সবচেয়ে ছোট চিত্রটি খুঁজে পায় যা "2014" হিসাবে স্বীকৃত হয়। ফলাফল উপলব্ধ ফন্টের উপর নির্ভর করে।

আমার কম্পিউটারে এখানে বিজয়ী রয়েছে - "ইউআরডাব্লু গথিক এল" ফন্ট ব্যবহার করে 53 বাইট: 2014

কোড:

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Ocr {
    public static boolean blankLine(final BufferedImage img, final int x1, final int y1, final int x2, final int y2) {
        final int d = x2 - x1 + y2 - y1 + 1;
        final int dx = (x2 - x1 + 1) / d;
        final int dy = (y2 - y1 + 1) / d;
        for (int i = 0, x = x1, y = y1; i < d; ++i, x += dx, y += dy) {
            if (img.getRGB(x, y) != -1) {
                return false;
            }
        }
        return true;
    }

    public static BufferedImage trim(final BufferedImage img) {
        int x1 = 0;
        int y1 = 0;
        int x2 = img.getWidth() - 1;
        int y2 = img.getHeight() - 1;
        while (x1 < x2 && blankLine(img, x1, y1, x1, y2)) x1++;
        while (x1 < x2 && blankLine(img, x2, y1, x2, y2)) x2--;
        while (y1 < y2 && blankLine(img, x1, y1, x2, y1)) y1++;
        while (y1 < y2 && blankLine(img, x1, y2, x2, y2)) y2--;
        return img.getSubimage(x1, y1, x2 - x1 + 1, y2 - y1 + 1);
    }

    public static int render(final Font font, final int w, final String name) throws IOException {
        BufferedImage img = new BufferedImage(w, w, BufferedImage.TYPE_BYTE_BINARY);
        Graphics2D g = img.createGraphics();
        float size = font.getSize2D();
        Font f = font;
        while (true) {
            final FontMetrics fm = g.getFontMetrics(f);
            if (fm.stringWidth("2014") <= w) {
                break;
            }
            size -= 0.5f;
            f = f.deriveFont(size);
        }
        g = img.createGraphics();
        g.setFont(f);
        g.fillRect(0, 0, w, w);
        g.setColor(Color.BLACK);
        g.drawString("2014", 0, w - 1);
        g.dispose();
        img = trim(img);
        final File file = new File(name);
        ImageIO.write(img, "gif", file);
        return (int) file.length();
    }

    public static boolean ocr() throws Exception {
        Runtime.getRuntime().exec("/usr/bin/tesseract 2014.gif out -psm 8").waitFor();
        String t = "";
        final BufferedReader br = new BufferedReader(new FileReader("out.txt"));
        while (true) {
            final String s = br.readLine();
            if (s == null) break;
            t += s;
        }
        br.close();
        return t.trim().equals("2014");
    }

    public static void main(final String... args) throws Exception {
        int min = 10000;
        for (String s : GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()) {
            for (int t = 0; t < 4; ++t) {
                final Font font = new Font(s, t, 50);
                for (int w = 10; w < 25; ++w) {
                    final int size = render(font, w, "2014.gif");
                    if (size < min && ocr()) {
                        render(font, w, "2014win.gif");
                        min = size;
                        System.out.println(s + ", " + size);
                    }
                }
            }
        }
    }
}

এই এবং অনুরূপ এন্ট্রিগুলিকে অনুমতি দেওয়ার জন্য আমি বিধি পরিবর্তন করেছি। চিত্তাকর্ষক ফাইল আকার।
চার্লস

1

গণিত 753 100

f[n_,format_]:=
Module[{filename},
Print["raster: ",n," by ", n];
filename="2014At"<>ToString[n]<>"."<>format;
Print["filename:  ",filename];
Print["format: ",format];
Print["raster image: ",rasterImg=Rasterize[Style[2014,"OCR A Std"],
RasterSize->n,ImageSize->1n,ImageResolution->6n]];
Export[filename,rasterImg];
Print["Actual imported image: ",img=Switch[format,"PDF"|"HDF",Import[filename][[1]],
_,Import[filename]]];
Print["Identified text: ",TextRecognize[ImageResize[img,Scaled[3]]]];
Print["filesize (bytes): ",FileByteCount[filename]]]

আমার এ পর্যন্ত সেরা মামলা:

f[24, "PBM"]

দক্ষতা


1

গণিত, 78 বাইট

ম্যাথমেটিকায় এটি জয়ের কৌশলটি সম্ভবত চিত্রনির্মিত [] ফাংশনটি নীচের মত ব্যবহার করবে।

প্রথম, আমি "2014" পাঠ্যটি তৈরি করেছি এবং ডেভিড ক্যারাহারের সমাধানের সাথে তুলনা করার জন্য এটি একটি জিআইএফ ফাইলে সংরক্ষণ করেছি। লেখাটি দেখতে ভালো লাগে 2014। এটি কোনওভাবেই অনুকূলিত নয়; এটি একটি সামান্য হরফ আকারে জেনেভা; অন্যান্য ফন্ট এবং আরও ছোট আকারের সম্ভব হতে পারে। স্ট্রেইট টেক্সট্রেকনাইজ [] ব্যর্থ হবে, তবে টেক্সটরেকজনাইজ [ইমেজরাইজাইজ []] কোনও সমস্যা নেই

filename = "~/Desktop/2014.gif";
Print["Actual imported image: ", img = Import[filename]]
Print["Identified text: ", 
 TextRecognize[ImageResize[img, Scaled[2]]]]
Print["filesize (bytes): ", FileByteCount[filename]]

ফলাফল

টাইপফেস, ফন্টের আকার, স্কেলিংয়ের ডিগ্রি ইত্যাদির সাথে ঝগড়া করার ফলে সম্ভবত এমনকী আরও ছোট ফাইলও কাজ করবে যা কার্যকর হয়।


ফাইলের আকার খুব চিত্তাকর্ষক।
ডেভিডসি

আপনি সাদা সীমানা থেকে চিত্রটি ছোট এবং অঙ্কগুলির মধ্যে ফাঁকা করার জন্য এটি আরও কমপ্যাক্ট করতে আবার আঁকতে পারেন।
সুইশ করুন

@ সুইশ সত্যই, সাদা সীমানা ছাঁটাই এটি 78 বাইতে লাগে।
মাইকেল স্টারন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.