Nadal jestem początkującym, ale chcę napisać program rozpoznawania znaków. Ten program nie jest jeszcze gotowy. Dużo edytowałem, dlatego komentarze mogą nie zgadzać się dokładnie. Będę używał 8-podłączeń do etykietowania podłączonego komponentu.Mój własny program OCR w Pythonie
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 ... diabeł tkwi w szczegółach. Aby to działało dobrze, myślę, że musisz załadować wiele różnych czcionek. Mam przeczucie, że programy OCR przechodzą przez różne czcionki, dopóki nie znajdą tego, który im się podoba. Oczywiście jest wiele publikacji na ten temat. Dlaczego chcesz zaimplementować to jako jedno z pierwszych zadań w Pythonie? –
Proces porównywania jest drugą częścią. :) Na początku chcę mówić o tym procesie wyszukiwania listów. - Chcę to zrobić, ponieważ myślę, że mogę to zrobić. Myślę, że nie jest to takie trudne. Zrobiłem to również: http://kkaammee.blogspot.com/ To też nie jest łatwe dla mnie. – kame
Więcej wyjaśnień: wszystko jest dobrze, jeśli twój kod jest czarno-biały. Co jednak jeśli niektóre litery/słowa będą szare? Chcesz czegoś takiego jak operacja GIMP "wybierz region według koloru". Osobiście zacznę od obliczenia rozkładu ciemności - średniej ciemności + std obrazu. Zacznę wtedy od "białego" miejsca i dalej wybieram biały, dopóki nie zidentyfikuję wysp pochodzenia niebiałego - to są potencjalne litery. Nawiasem mówiąc, nie potrzebujesz przypadkowości - pierwsze wyszukiwanie może pomóc Ci zlokalizować wszystkie czarne piksele, a także w zlokalizowaniu wysp. –