Я пытаюсь распознавать изображения, используя простые числа. Но моя проблема заключается в том, что каждый раз, когда я запускаю изображение с другой цифрой, оно показывает одно и то же значение вместо отображаемого изображения.
Я пробовал это с разными цифрами, а также проверял код много раз в каждой функции.
#VKA
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import time
from functools import reduce
from collections import Counter
def createExamples():
numberArrayExamples = open('numArEx.txt','a')
numbersWeHave = range(0,10)
versionsWeHave = range(1,10)
for eachNum in numbersWeHave:
for eachver in versionsWeHave:
#print(str(eachNum)+'.'+str(eachver))
imgFilePath = 'images/numbers/'+str(eachNum)+'.'+str(eachver)+'.png'
#print(imgFilePath)
ei = Image.open(imgFilePath)
eiar = np.array(ei)
# print(eiar)
eiar1 = str(eiar.tolist())
# print(eiar1)
lineToWrite = str(eachNum)+'::'+eiar1+'\n'
#print(lineToWrite)
numberArrayExamples.write(lineToWrite)
def threshold(imgarray):
balanceAR = []
newAR = imgarray
for eachrow in imgarray:
for eachpix in eachrow:
avgNum = reduce(lambda x, y : x + y,
eachpix[:3])/len(eachpix[:3])
balanceAR.append(avgNum)
#print(balanceAR)
balance = reduce(lambda x, y : x + y, balanceAR)/len(balanceAR)
#print(balance)
for eachrow in newAR:
for eachpix in eachrow:
if reduce(lambda x, y :
x + y, eachpix[:3])/len(eachpix[:3]) > balance:
eachpix[0] = 255
eachpix[1] = 255
eachpix[2] = 255
eachpix[3] = 255
else:
eachpix[0] = 0
eachpix[1] = 0
eachpix[2] = 0
eachpix[3] = 255
return newAR
def whatNumIsThis(filepath):
matchedAr = []
loadExamps = open("numArEx.txt",'r').read()
loadExamps = loadExamps.split('\n')
i = Image.open(filepath)
iar = np.array(i)
iarl = iar.tolist()
threshold(iar)
inQuestion = str(iarl)
for eachExample in loadExamps:
if len(eachExample) > 3:
#print(len(eachExample))
splitEx = eachExample.split('::')
#print(splitEx)
currentNum = splitEx[0]
#print(currentNum)
currentAr = splitEx[1]
#print(currentAr)
eachPixEx = currentAr.split('],')
#print(eachPixEx)
eachPixInQ = inQuestion.split('],')
# print(eachPixInQ)
x=0
#print(eachPixEx)
while x < len(eachPixEx):
if eachPixEx[x] == eachPixInQ[x]:
matchedAr.append(int(currentNum))
x += 1
print(matchedAr)
x = Counter(matchedAr)
print(x)
graphX = []
graphY = []
for eachThing in x:
# print(eachThing)
graphX.append(eachThing)
# print(x[eachThing])
graphY.append(x[eachThing])
fig = plt.figure()
ax1 = plt.subplot2grid((4,4),(0,0), rowspan=1, colspan=4)
ax2 = plt.subplot2grid((4,4),(1,0), rowspan=3, colspan=4)
ax1.imshow(iar)
ax2.bar(graphX,graphY, align='center')
plt.ylim(400)
xloc = plt.MaxNLocator(12)
#print(xloc)
ax2.xaxis.set_major_locator(xloc)
#plt.show()'''
#createExamples()
whatNumIsThis('images/test.png')
Ожидаемый результат должен быть таким, как если бы тестовое изображение было 3, на нем должно отображаться значение счетчика с 3 в качестве согласованного значения с наивысшей степенью точности. Но проблема здесь заключается в том, что каждый раз с разными входами, он отображает 4 как выход для каждого числового изображения ...
Для более подробного описания см. Следующую ссылку ...
https://pythonprogramming.net/image-recognition-python/