Sono ancora un principiante ma voglio scrivere un programma di riconoscimento dei caratteri. Questo programma non è ancora pronto. E ho curato molto, quindi i commenti potrebbero non corrispondere esattamente. Userò la connettività 8 per l'etichettatura dei componenti collegati.Il mio programma OCR in Python
from PIL import Image
import numpy as np
im = Image.open("D:\\Python26\\PYTHON-PROGRAMME\\bild_schrift.jpg")
w,h = im.size
w = int(w)
h = int(h)
#2D-Array for area
area = []
for x in range(w):
area.append([])
for y in range(h):
area[x].append(2) #number 0 is white, number 1 is black
#2D-Array for letter
letter = []
for x in range(50):
letter.append([])
for y in range(50):
letter[x].append(0)
#2D-Array for label
label = []
for x in range(50):
label.append([])
for y in range(50):
label[x].append(0)
#image to number conversion
pix = im.load()
threshold = 200
for x in range(w):
for y in range(h):
aaa = pix[x, y]
bbb = aaa[0] + aaa[1] + aaa[2] #total value
if bbb<=threshold:
area[x][y] = 1
if bbb>threshold:
area[x][y] = 0
np.set_printoptions(threshold='nan', linewidth=10)
#matrix transponation
ccc = np.array(area)
area = ccc.T #better solution?
#find all black pixel and set temporary label numbers
i=1
for x in range(40): # width (later)
for y in range(40): # heigth (later)
if area[x][y]==1:
letter[x][y]=1
label[x][y]=i
i += 1
#connected components labeling
for x in range(40): # width (later)
for y in range(40): # heigth (later)
if area[x][y]==1:
label[x][y]=i
#if pixel has neighbour:
if area[x][y+1]==1:
#pixel and neighbour get the lowest label
pass # tomorrows work
if area[x+1][y]==1:
#pixel and neighbour get the lowest label
pass # tomorrows work
#should i also compare pixel and left neighbour?
#find width of the letter
#find height of the letter
#find the middle of the letter
#middle = [width/2][height/2] #?
#divide letter into 30 parts --> 5 x 6 array
#model letter
#letter A-Z, a-z, 0-9 (maybe more)
#compare each of the 30 parts of the letter with all model letters
#make a weighting
#print(letter)
im.save("D:\\Python26\\PYTHON-PROGRAMME\\bild2.jpg")
print('done')
Hm ... il diavolo è nei dettagli. Per far sì che funzioni bene, penso che sia necessario caricare molti caratteri diversi. La mia impressione è che i programmi OCR passino in rassegna vari tipi di carattere finché non trovano quello che preferiscono. Ovviamente, ci sono molti articoli pubblicati sull'argomento. Perché vuoi implementarlo come una delle tue prime attività Python? –
Il processo di confronto è la seconda parte. :) All'inizio voglio parlare di questo processo di ricerca delle lettere. - Voglio farlo, perché penso di poterlo fare. Penso che non sia così difficile. Ho anche fatto questo: http://kkaammee.blogspot.com/ Non è facile, almeno per me. – kame
Altri chiarimenti: tutto va bene se il tuo codice è in bianco e nero. Tuttavia, cosa succede se alcune lettere/parole sono in grigio? Vuoi qualcosa come l'operazione "seleziona regione per colore dato soglia" di Gimp. Personalmente avrei iniziato calcolando la distribuzione dell'oscurità - oscurità media + std dell'immagine. Inizierei quindi da un punto "bianco" e continuerò a selezionare il bianco, finché non identificherò le isole non bianche: quelle sono le lettere potenziali. A proposito, non hai bisogno di casualità: una ricerca per ampiezza può aiutarti a localizzare tutti i pixel neri ... il trucco sta nel localizzare le isole. –