Hitung jumlah angka di area gambar

8

Tujuan Anda adalah untuk menulis program atau fungsi lengkap yang mengambil 5 bilangan bulat positif dan string dengan nama file gambar sebagai input [X1,Y1], [X2,Y2], N, image.jpgdalam format apa pun yang masuk akal, di mana:

  • Pasangan pertama [X1,Y1]adalah kiri atas X, Ykoordinat ( <=20) area persegi panjang biru pada gambar contoh ( 16,11).
  • Pasangan kedua [X2,Y2]adalah kanan bawah X, Ykoordinat ( <=20) area kotak biru pada contoh gambar ( 20,22).
  • Angka kelima Ndemikian 0 <= N <= 9adalah angka yang harus ditemukan.
  • Parameter keenam adalah string dengan nama file gambar JPG ini .

Keluarkan berapa banyak Nyang ada di area yang ditunjukkan (diuraikan dengan warna biru pada gambar untuk contoh ini):

masukkan deskripsi gambar di sini

Klik di sini untuk mendapatkan versi bersih yang lebih besar dari gambar yang sama.

Dalam gambar ada 500 angka dari 0hingga 9(termasuk) diatur dalam 20 kolom per 25 baris, dalam Courier Newfont monospace . Setiap angka berbeda memiliki warna berbeda (Anda dapat memanfaatkan fakta ini atau mengabaikannya dan mempertimbangkan atau mengonversi gambar dalam monokrom jika itu membantu Anda).

Kasus uji:

[4,4],[13,5],1,image.jpg    > 4  (outlined in red)
[4,4],[13,5],4,image.jpg    > 2  (outlined in red)
[17,5],[17,5],2,image.jpg   > 1  (outlined in magenta)
[17,5],[17,5],9,image.jpg   > 0  (outlined in magenta)
[20,8],[20,9],3,image.jpg   > 1  (outlined in cyan)
[20,8],[20,9],2,image.jpg   > 0  (outlined in cyan)
[16,11],[20,22],0,image.jpg > 8  (outlined in blue)
[16,11],[20,22],3,image.jpg > 9  (outlined in blue)
[3,14],[11,20],7,image.jpg  > 6  (outlined in green)
[3,14],[11,20],5,image.jpg  > 6  (outlined in green)
[3,14],[11,20],8,image.jpg  > 8  (outlined in green)
[1,1],[20,25],0,image.jpg   > 47 (whole picture)
[1,1],[20,25],8,image.jpg   > 50 (whole picture)
[1,1],[20,25],1,image.jpg   > 55 (whole picture)

Aturan:

  • Ini adalah sehingga kode terpendek menang.
  • Anda harus mengambil sebagai masukan file JPG ini .
  • Anda tidak diizinkan untuk melakukan hardcode pada matriks angka yang diwakili dalam JPG, atau hasilnya.
  • Celah standar dilarang.
Mario
sumber

Jawaban:

4

Mathematica, 92 byte

Count[Take[Characters@StringSplit@TextRecognize@Binarize[Import@#4,.9],#2,#],ToString@#3,2]&

Fungsi yang tidak disebutkan namanya mengambil argumen dalam format ini: [{X1,X2}, {Y1,Y2}, N, "image.jpg"]. (Memang, argumen keempat dapat berupa nama file lokal atau URL http://i67.tinypic.com/6qh5lj.jpg.)

Import@#4mengimpor file gambar, Binarize[...,.9]menggelapkan semua angka menjadi hitam, dan TextRecognize(fungsinya jelas-jelas melakukan pengangkatan berat di sini!) mengekstraksi string multi-garis dari gambar yang dihasilkan, yang dipecah menjadi daftar karakter bersarang Characters@.

Take[...,#2,#]hanya menyimpan karakter yang sesuai dengan persegi panjang yang diuraikan, dan Count[...,ToString@#3,2]menghitung jumlah kemunculan Ndalam hasil.

Greg Martin
sumber
2

Python 3 + bantal + pytesseract, 239 byte

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split()[i//w+a[1]-1][i%w+a[0]-1]==str(n)])

Ini sangat tidak efisien karena untuk setiap ubin nomor, seluruh file diuraikan. Lebih cepat dan sedikit lebih panjang 243 bytes solusi akan

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):s=image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split();w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if s[i//w+a[1]-1][i%w+a[0]-1]==str(n)])
TidB
sumber