####### test 이미지 만들기 #######
test_digits= cv2.imread('./Data/digits.jpg')
#크기확인
re_digits= cv2.resize(test_digits,(int(test_digits.shape[1]*0.2),
int(test_digits.shape[0]*0.2))) #사이즈 줄이기
crop_digits=re_digits[0:int(re_digits.shape[0]-10),
15:int(re_digits.shape[1]-40)] #불필요한부분 자르기
gray_digits = cv2.cvtColor(crop_digits,cv2.COLOR_BGR2GRAY)#그레이화
retval,bin_digits= cv2.threshold(gray_digits, 170, 255, cv2.THRESH_BINARY_INV)
bin_digits = cv2.morphologyEx(bin_digits, cv2.MORPH_OPEN ,
cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2,2)), iterations = 2)
src,contours,hierarchy= cv2.findContours(bin_digits, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow('src',bin_digits) #모폴로지 확인
bR_arr = []
digit_arr = []
digit_arr2 = []
count = 0
## 숫자별 Bounding Rect 구하기
bounding_rects = []
rect_digits = crop_digits.copy()
num = 1
for c in contours:
num = 1 +len(c)
x, y, w, h = cv2.boundingRect(c)
if w > 2 and h > 10:
bounding_rects.append([x,y,w,h])
bR_arr = sorted(bounding_rects, key=lambda num : num[0], reverse = False)# sorted
cv2.rectangle(rect_digits, (x, y), (x+w, y+h),(255,0,0), 2)
cv2.putText(rect_digits, str(num), (int(x), int(y)), cv2.FONT_HERSHEY_COMPLEX,
0.8, (0, 0, 0), 2)
# for i in range(0,len(bounding_rects)):
# a = bin_digits[bounding_rects[i][1]:bounding_rects[i][1]+bounding_rects[i][3],bounding_rects[i][0]:bounding_rects[i][0]+bounding_rects[i][2]]
# cv2.imwrite('kNN/testPNGs/%d.png' %i ,a )
cv2.imshow('test',rect_digits )
cv2.waitKey()
cv2.destroyAllWindows()
for x,y,w,h in bR_arr :
count += 1
digit_arr.append(bin_digits[y-2:y+h+2,x-2:x+w+2])
if count == 12 : #마지막줄에왔을떄 digit_arr2에 옮겨주고 digit_arr와 count는 초기화한다.
digit_arr2.append(digit_arr)
digit_arr = []
count = 0
#리스트에 저장된 이미지를 32x32의 크기로 리사이즈해서 순서대로 저장
for i in range(0,len(digit_arr2)) :
for j in range(len(digit_arr2[i])) :
count += 1
if i == 0 : #1일 경우 비율 유지를 위해 마스크를 만들어 그위에 얹어줌
width = digit_arr2[i][j].shape[1]
height = digit_arr2[i][j].shape[0]
tmp = (height - width)/2
mask = np.zeros((height,height))
mask[0:height,int(tmp):int(tmp)+width] = digit_arr2[i][j]
digit_arr2[i][j] = cv2.resize(mask,(32,32))
else:
digit_arr2[i][j] = cv2.resize(digit_arr2[i][j],(32,32))
if i == 9 : i = -1
cv2.imwrite('./kNN/testPNGs/'+str(i+1)+'_'+str(j)+'.png',digit_arr2[i][j])
def preprocessing_txt(path):
txtPaths = [os.path.join(path,f) for f in os.listdir(path)]
count = 0
#파일읽기
for txtPath in txtPaths :
count += 1
filename = os.path.basename(txtPath)
f = open(txtPath)
img = []
while True :
tmp=[]
text = f.readline()
if not text :
break
for i in range(0,len(text)-1) :
#라인을 일어올때 text가 1일경우 255로 변경
if int(text[i]) == 1 :
tmp.append(np.uint8(255))
else :
tmp.append(np.uint8(0))
img.append(tmp)
img = np.array(img)
cv2.imwrite('./kNN/trainingPNGs/'+filename.split('.')[0]+'.png',img)
print('\n'+str(count)+'files are saved(preprocessing_txt2png)')
def KNN(train_x,train_y,test_x,test_y): #knn알고리즘 결과출력
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(train_x,train_y)
pre_arr = clf.predict(test_x)
pre_arr = pre_arr.reshape(10,12)
print('kNN의 테스트 세트 예측 :\n{}'.format(pre_arr))
print('kNN의 테스트 세트 정확도 : {0:0.2f}%'.format(clf.score(test_x,test_y)*100))
print('------------------------------------------------------')
def GNB(train_x,train_y,test_x,test_y): #GaussianNB알고리즘 결과출력
gnb = GaussianNB()
gnb.fit(train_x,train_y)
pre_arr = gnb.predict(test_x)
pre_arr = pre_arr.reshape(10,12)
print('GaussianNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
print('GaussianNB의 테스트 세트 정확도 : {0:0.2f}%'.format(gnb.score(test_x,test_y)*100))
print('------------------------------------------------------')
def MNB(train_x,train_y,test_x,test_y): #MultinomialNB알고리즘 결과출력
mnb = MultinomialNB()
mnb.fit(train_x,train_y)
pre_arr = mnb.predict(test_x)
pre_arr = pre_arr.reshape(10,12)
print('MultinomialNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
print('MultinomialNB의 테스트 세트 정확도 : {0:0.2f}%'.format(mnb.score(test_x,test_y)*100))
print('------------------------------------------------------')
def CNB(train_x,train_y,test_x,test_y): #ComplementNB알고리즘 결과출력
cnb = ComplementNB()
cnb.fit(train_x,train_y)
pre_arr = cnb.predict(test_x)
pre_arr = pre_arr.reshape(10,12)
print('ComplementNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
print('ComplementNB의 테스트 세트 정확도 : {0:0.2f}%'.format(cnb.score(test_x,test_y)*100))
print('------------------------------------------------------')
def BNB(train_x,train_y,test_x,test_y): #BernoulliNB알고리즘 결과출력
bnb = BernoulliNB()
bnb.fit(train_x,train_y)
pre_arr = bnb.predict(test_x)
pre_arr = pre_arr.reshape(10,12)
print('BernoulliNB의 테스트 세트 예측 :\n{}'.format(pre_arr))
print('BernoulliNB의 테스트 세트 정확도 : {0:0.2f}%'.format(bnb.score(test_x,test_y)*100))
print('------------------------------------------------------')
def createdataset(directory): #sklearn사용을 위해 데이터세트를 생성
files = os.listdir(directory)
x = []
y = []
for file in files:
attr_x = cv2.imread(directory+file, cv2.IMREAD_GRAYSCALE)
attr_x = attr_x.flatten()
attr_y = file[0]
x.append(attr_x)
y.append(attr_y)
x = np.array(x)
y = np.array(y)
return x , y
preprocessing_txt('./kNN/trainingDigits')
print('Machine learning Calculating Result..')
train_dir = './kNN/trainingPNGs/'
train_x ,train_y = createdataset(train_dir)
test_dir = './kNN/testPNGs/'
test_x , test_y = createdataset(test_dir)
KNN(train_x, train_y, test_x, test_y)
GNB(train_x, train_y, test_x, test_y)
MNB(train_x, train_y, test_x, test_y)
CNB(train_x, train_y, test_x, test_y)
BNB(train_x, train_y, test_x, test_y)
Python/Open_CV