Zobacz także: Analiza składni
Wprowadzenie
Pracujesz w rządowym zespole programistycznym, który programuje fotoradary. Jednak grupa osób, które zaprogramowały kalkulator prędkości, zajęła zbyt dużo miejsca, więc musisz zminimalizować oprogramowanie do rozpoznawania tablic rejestracyjnych.
Wyzwanie
Biorąc pod uwagę obraz tablicy rejestracyjnej, umieść tekst na tablicy.
Tablice rejestracyjne
Oto wszystkie znaki, które program musi rozpoznać:
ABCDEFG
H1JKLMN0
PQRSTUVW
XYZ01234
56789
Uwaga
Na brytyjskich tablicach rejestracyjnych znaki dla I (i) i 1 (jeden) są takie same, a znaki dla O (o) i 0 (zero) są takie same. Z tego powodu zawsze zakładaj, że znaki są liczbami. Czyli następująca tablica rejestracyjna to 10 (jedno zero):
Przykłady
C0D3 GLF
B3T4 DCY
M1NUS 15
YET1CGN
Inne zasady
Dostęp do Internetu oraz biblioteki i funkcje OCR są niedozwolone.
Tablice rejestracyjne zawsze będą wyglądały identycznie jak te pokazane powyżej. Wszystkie tablice rejestracyjne będą mniej więcej tego samego rozmiaru (będą pewne niedokładności z powodu metody przycinania).
Jeśli potrzebujesz bezstratnych wersji tablic rejestracyjnych w formacie PNG, dostarczę je ci.
Punktacja
Najkrótszy program w bajtach wygrywa.
Wszystkie tablice rejestracyjne to zrzuty ekranu paska wyszukiwania w tej witrynie
źródło
Odpowiedzi:
C, 409 bajtów (i jestem równie zaskoczony jak wszyscy)
Pobiera jako dane wejściowe: szerokość (
w
) i wysokość (h
) obrazu, a następnie spakowane dane RGB jako tablicachar
s (d
). Wszystkie pozostałe parametry funkcji są zmiennymi deklaracjami w przebraniu. Ignoruje wszystko oprócz kanału zielonego i stosuje próg 32 jako początkowe przejście.Przeważnie to samo co metoda @ DavidC, z tym wyjątkiem, że co najmniej 35% każdego pola próbki jest wypełnione. Mamy nadzieję, że dzięki temu skalowanie zmian jest bardziej niezawodne, ale kto wie.
Użyłem metody brute-force, aby dowiedzieć się, który rozmiar ponownego próbkowania i procent pokrycia należy użyć dla najlepszej niezawodności (tj. Najmniejszej liczby przypadków, w których jeden znak ma wiele interpretacji). Okazało się, że najlepsza była siatka 4x5 z 35% pokryciem. Następnie użyłem drugiej metody brute-force, aby obliczyć najlepsze ustawienie bitu i wartość modulo, aby spakować dane znaku do krótkiego ciągu - niski bit w lewym górnym rogu, rosnący w x, a następnie y, z końcową wartością% 101 zmienioną najlepiej, podając tę tabelę odnośników:
Odejmowanie 7 oznacza, że inicjały można usunąć, a ostatnie 2 można usunąć bez dodatkowej pracy. Usunięcie to oznacza, że niektóre nieprawidłowe dane wejściowe mogą spowodować nieprawidłowy odczyt pamięci, co może spowodować uszkodzenie poszczególnych obrazów.
Stosowanie:
Aby umieścić w nim obrazy, napisałem opakowanie za pomocą libpng. Okazuje się również, że pomimo nazwy pliku obrazy w pytaniu są w rzeczywistości JPEG (!), Więc najpierw musisz je ręcznie wyeksportować jako pngs.
Awaria
źródło
Mathematica
1170 1270 1096 1059 650 528 570 551 525498 bajtówNajnowsza wersja pozwala zaoszczędzić 27 bajtów, ponieważ nie wymaga „przycinania” tablicy przed parsowaniem. Przedostatnia wersja zaoszczędziła 26 bajtów, wykorzystując tylko 10 oryginalnych 24 punktów próbnych.
122 bajty zaoszczędzone dzięki pomysłowi LegionMammal978 spakowania długiej listy liczb podstawowych 10 jako pojedynczej liczby podstawowej 36. Oddzielił kolejne 20 bajtów od końcowego kodu.
Skok z 528 do 570 bajtów wynikał z dodatkowego kodu, aby upewnić się, że kolejność zwracanych liter odpowiada kolejności liter na tablicy rejestracyjnej. Środek ciężkości każdej litery zawiera współrzędną x, która ujawnia względne położenie liter wzdłuż x.
Kod niepoznany
Przegląd
Podstawową ideą jest sprawdzenie, czy systematyczne próbkowanie pikseli z obrazu wejściowego jest zgodne z pikselami z tego samego miejsca na obrazach bonafide. Znaczna część kodu składa się z sygnatur bitowych dla każdego znaku,
Schemat pokazuje piksele próbkowane z liter „J”, „P”, „Q” i „R”.
Wartości pikseli mogą być reprezentowane jako macierze. Ciemne, pogrubione
1
odpowiadają czarnym komórkom. Te0
odpowiadają białym komórkom.Są to zasady zastępowania odszyfrowywania JPQ R.
{1, 1, 1, 1, 9, 15} -> „J”,
{15, 9, 15, 14, 8, 8} -> „P”,
{15, 9, 9, 9, 15, 15 } -> „Q”,
{15, 9, 15, 14, 10, 11} -> „R”
Powinno być możliwe zrozumienie, dlaczego reguła dla „0” to:
{15, 9, 9, 9, 9, 15} -> „0”
i dlatego można je odróżnić od litery „Q”.
Poniżej przedstawiono 10 punktów wykorzystanych w ostatecznej wersji. Punkty te są wystarczające do zidentyfikowania wszystkich znaków.
Jakie funkcje pełnią
plateCrop[img]
usuwa ramkę i lewą krawędź z płyty, sprawia, że tło jest białe. Udało mi się wyeliminować tę funkcję z ostatecznej wersji, wybierając komponenty obrazu, możliwe litery o wysokości od 100 do 120 pikseli.isolateLetters[img]
usuwa pojedyncze litery z przyciętego obrazu.Możemy pokazać, jak to działa, pokazując, gdzie przycięty obraz, wyjście z
plateCrop
idzie jako dane wejścioweisolateLetters
. Dane wyjściowe to lista pojedynczych znaków.Coordinates
to 24 równomiernie rozmieszczone pozycje do sprawdzania koloru pikseli. Współrzędne odpowiadają tym na pierwszym rysunku.{{9, 99}, {27, 99}, {45, 99}, {63, 99}, {9, 81}, {27, 81}, {45, 81}, {63, 81}, { 9, 63}, {27, 63}, {45, 63}, {63, 63}, {9, 45}, {27, 45}, {45, 45}, {63, 45}, {9, 27}, {27, 27}, {45, 27}, {63, 27}, {9, 9}, {27, 9}, {45, 9}, {63, 9}}
h
konwertuje piksele na binarne.codes
są sygnaturą każdego znaku. Wartości dziesiętne są skrótami kodu binarnego dla czarnych (0) i białych (1) komórek. W wersji golfowej stosowana jest podstawa 36.(*
decryptRules
służą do zastępowania podpisów ich odpowiednimi postaciami *)f
to funkcja, która pobiera obraz tablicy rejestracyjnej i zwraca literę.{„A”, „B”, „C”, „D”, „E”, „F”, „G”}
{„H”, „1”, „J”, „K”, „L”, „M”, „N”, „0”}
{„P”, „Q”, „R”, „S”, „T”, „U”, „V”, „W”}
{„X”, „Y”, „Z”, „0”, „1”, „2”, „3”, „4”}
{„5”, „6”, „7”, „8”, „9”}
Grał w golfa
Kod jest skracany za pomocą pojedynczej liczby dziesiętnej reprezentującej wszystkie 24 bity (biały lub czarny) dla każdego znaku. Na przykład litera „J” stosuje następującą regułę zastępczy:
1118623 -> "J"
.1118623 odpowiada
{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1}
który można ponownie zapakować jako
{{0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} , {1, 1, 1, 1}}
który jest po prostu matrycą „J”, którą widzieliśmy powyżej.
Kolejne oszczędności wynikają z reprezentowania alfabetu
"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"
zamiast listy liter.Na koniec wszystkie funkcje z długiej wersji, oprócz
h
, zostały zintegrowane z funkcją,f
a nie zdefiniowane osobno.źródło
{1118623, 2518818, ..., 16645599}
z tego .x[[All,2,1]]
można zastąpićx[[;;,2,1]]
.Flatten[x,1]
jest równoważneJoin@@x
iFlatten[#,1]&/@x
jest równoważne zJoin@@@x
. Istnieje kilka innych drobnych optymalizacji, które można wykonać. Kod 551 bajtów po tych golfach.C #,
10401027 bajtówNie golfowany:
Zasadniczo znalazłem pewne konkretne punkty odniesienia, aby sprawdzić żółty / czarny, aby określić tożsamość każdego znaku.
źródło
csc.exe main.cs /r:System.Drawing.dll
PHP -
174116741143 bajtówNajpierw utworzono go, ucząc się profili postaci z kilku pierwszych przykładów, które następnie podsumowały każdą postać na sześć liczb. Wybrałem sześć, ponieważ pierwotnie miałem pięć, i to nie działało tak dobrze, jak bym chciał, ale sześć wydaje się działać znacznie lepiej. Znaczna część optymalizacji polega na ściskaniu tych profili na coraz mniejszą liczbę bajtów.
Pierwszy i drugi profil,
*lhdfdn
a|nnmmkk
właściwie niebieski kropla z „GB” u dołu*
i prawą ramką|
, które ignorujemy. Bezpieczniej jest je uwzględnić, aby kropelka i prawa krawędź miały coś do dopasowania.Powinien obsługiwać dowolny format obrazu, każde rozsądne skalowanie, pod warunkiem, że proporcje nie zmieniają się zbytnio, żadnego ciemnego na jasnym kolorze, a nawet odrobiny szumu i cieniowania!
Potrzebuje granicy, przynajmniej u góry iu dołu, która jest częścią profilu.
Zapisz jako
ocr.php
, a następnie uruchom z wiersza poleceń:Dla zainteresowanych, oto kod do nauki. Zapisz jako
learn.php
i uruchom z wiersza poleceń, bez argumentów.źródło
PHP,
971970 bajtówRysuje mocno na Yimin Rong „s odpowiedzi , które mogą być poważnie grałem w dół, zwłaszcza indeksów tablicy, i umieścić w Phar z kompresją gzip.
Pobierz phar
To jest moja ulepszona wersja podstawowa o
15571535 bajtach, zapisana pod nazwą pliku „o”:Ulepszenia:
1. etap
2. etap
intval
z~~
(oszczędność 8 bajtów, dwie occurences)file_get_contents($u)
zastąpiony przezjoin('',file($u))
(zapisuje 5 bajtów)Niestety, wszystkie ulepszenia drugiego etapu przekładają się tylko na 1 bajt kodu gzipowanego. :-RE
I ten kod został użyty do utworzenia Phara:
Przetestuj za pomocą
php ocr.phar http://i.imgur.com/i8jkCJu.png
dowolnego innego obrazu przypadku testowego.źródło