점자가 있고, 점자를 읽으면 된다.
네이버에서 점자 표를 찾아서 읽어서 해석해도 되지만 그래서는 아무 도움이 되지 않기에 프로그래밍했다.
방법론.
1. 일정이상 검은색 부분은 완전히 검게 칠하고, 아닌부분은 희게 칠해버린다.
2. 쓸때없는 바탕 부분은 잘라내고, 점자판을 각각의 점에 맞게 칸을 나눈다. (그래야 판별하기 쉽다.)
3. 나눠진 판을 토대로 알고리즘을 짜서 점자를 식별한다.
2까지 완료된 결과물.
코드.
# -*- encoding: cp949 -*- import numpy as np import cv2 import Image dot_dic = {'000001':'BIG','100000':'a','101000':'b','110000':'c','110100':'d','100100':'e','111000':'f',\ '111100':'g','101100':'h','011000':'i','011100':'j','100010':'k','101010':'l','110010':'m','110110':'n',\ '100110':'o','111010':'p','111110':'q','101110':'r','011010':'s','011110':'t','100011':'u','101011':'v',\ '011101':'w','110011':'x','110111':'y','100111':'z','001000':',','001101':'\''} im = Image.open('chall.png') min = [999,999]; max = [0,0] for i in range(im.size[1]): for j in range(im.size[0]): color = im.getpixel((j,i)) if color[0] > 200 and color[1] > 200 and color[2] > 200: im.putpixel((j,i),(255,255,255)) else: im.putpixel((j,i),(0,0,0)) if im.getpixel((j,i)) != (255,255,255): if min[0] > j: min[0] = j if min[1] > i: min[1] = i if max[0] < j: max[0] = j if max[1] < i: max[1] = i im.crop((min[0],min[1],max[0],max[1])).save('chall1.png') im = Image.open('chall1.png') for i in range(im.size[1]): #위의 사진의 십자선. 실전에서는 이렇게 주석처리해놓고 한다. for j in range(1,64): im.putpixel((int(im.size[0]/64.0*j),i),(255,0,0)) for i in range(im.size[0]): for j in range(1,18): im.putpixel((i,int(im.size[1]/18.0*j)),(255,0,0)) im.save('chall1.png') dot = '' im = Image.open('chall1.png') for k in range(4): for i in range(3): for j in range(64): #점자 인식부. 아래는 솔직히 좀 가라로 인식했다. 정확하게 할수도 있을거같은데 귀찮아서 안짬. if im.getpixel((int(im.size[0]/64.0*j) + 2 ,int(im.size[1]/18.0)*5*k + int(im.size[1]/18.0)*i + int(im.size[1]/18.0)/2)) == (0,0,0)\ or im.getpixel((int(im.size[0]/64.0*j) + 3 ,int(im.size[1]/18.0)*5*k + int(im.size[1]/18.0)*i + int(im.size[1]/18.0)/2)) == (0,0,0)\ or im.getpixel((int(im.size[0]/64.0*j) + 4 ,int(im.size[1]/18.0)*5*k + int(im.size[1]/18.0)*i + int(im.size[1]/18.0)/2)) == (0,0,0)\ or im.getpixel((int(im.size[0]/64.0*j) + 3 ,int(im.size[1]/18.0)*5*k + int(im.size[1]/18.0)*i+2 + int(im.size[1]/18.0)/2)) == (0,0,0): dot += '1' else: dot += '0' dot += '\n' print dot answer = '' dot = dot.split('\n') flag = False for i in range(0,len(dot),3): j = 0 while j < len(dot[i]): if j > 62: break num = '' for k in range(3): for l in range(2): num += dot[i+k][j+l] if num=='000000': answer += ' ' j += 2 continue try: if dot_dic[num]=='BIG': flag = True else: answer += dot_dic[num] except: answer += '?' j += 3 answer += '\n' if flag: answer = answer.upper() print '%s' %answer
점자를 개발한 사람의 first name은? 구글에 쳐보면 Louis Braille라는 사람이 나온다.
답은 Louis
'machine learning, image' 카테고리의 다른 글
digit recognition with MNIST database with sklearn (0) | 2015.09.21 |
---|---|
데이터마이닝, 머신러닝 공부관련(커리큘럼) (2) | 2015.09.01 |
DareYourMind programming 8 (0) | 2015.07.23 |
W3Challs Chuck Norris Challenge(half) (0) | 2015.07.23 |
WeChall Crackcha 관련 삽질. (0) | 2015.07.11 |