Prin OCR (Optical Character Recognition) se înţelege tehnologia prin care un program de calculator identifică textul dintr-un fișier în care acesta nu e stocat ca şiruri de caractere, ci ca ansamblu de pixeli (imagine).
Să presupunem că am scanat o imagine alb negru care conţine doar cifre. Cifrele sunt formate din puncte (pixeli) negre iar fundalul din puncte albe. Imaginea va fi reprezentată ca un tablou dreptunghiular de cifre 0
şi 1
, cifrele 1
formează obiectele din imagine iar cifrele 0
fundalul.
Cerinţă
Scrieţi un program care să determine:
a) câte cifre sunt în imagine;
Exemplu
easyocr.in
17 15 000000000000000 011111000000000 010000000000000 010000000000000 011111000000001 000001000000011 000001011111001 011111000001001 000000000001001 011111000010001 000001000100101 000001000101100 011111000100100 000001000000100 000001000000100 011111000000100 000000000000100
easyocr.out
5 1 2 3 1 5 1 7 1
Explicație
În imagine se află 5
cifre unde:
- cifra
1
apare de2
ori; - cifra
3
apare o singură dată; - cifra
5
apare o singură dată; - cifra
7
apare tot o singură dată.
#include <bits/stdc++.h> using namespace std; ifstream cin("easyocr.in"); ofstream cout("easyocr.out"); bool a[1011][1011] , b[1011][1011]; int f[10] , n , m; bool in(int i , int j) { return i <= n && i >= 1 && j <= m && j >= 1; } void fill(int i , int j , int &cnt) { a[i][j]=0; cnt++; if(a[i+1][j]==1 && in(i+1 , j)) fill(i+1 , j , cnt); if(a[i-1][j]==1 && in(i-1 , j)) fill(i-1 , j , cnt); if(a[i][j+1]==1 && in(i , j+1)) fill(i , j+1 , cnt); if(a[i][j-1]==1 && in(i , j-1)) fill(i , j-1 , cnt); if(a[i+1][j-1]==1 && in(i+1 , j-1)) fill(i+1 , j-1 , cnt); } int main() { cin >> n >> m; char ch; for(int i = 1 ; i <= n ; ++i) for(int j = 1 ; j <= m ; ++j) { cin >> ch; a[i][j]=ch - '0'; b[i][j]=a[i][j]; } int nr=0; for(int i = 1 ; i <= n ; ++i) { for(int j = 1 ; j <= m ; ++j) { if(a[i][j]==1) { nr++; int cnt=0; fill(i , j , cnt); if(cnt==20) f[0]++; else if(cnt==8) f[1]++; else if(cnt==19) { if(b[i+4][j]==1) f[2]++; else if(b[i+1][j+4]==1) f[3]++; else f[5]++; } else if(cnt==14) f[4]++; else if(cnt==21) { if(b[i+1][j+4]==1) f[9]++; else f[6]++; } else if(cnt==11) f[7]++; else if(cnt==23) f[8]++; } } } cout << nr << endl; for(int i = 0 ; i <= 9 ; ++i) if(f[i]>0) cout << i << ' ' << f[i] << ' '; return 0; }