machine learning, image

Net-Force Hmmm, I don't see it...

qkqhxla1 2015. 7. 24. 20:20

점자가 있고, 점자를 읽으면 된다.


네이버에서 점자 표를 찾아서 읽어서 해석해도 되지만 그래서는 아무 도움이 되지 않기에 프로그래밍했다.


방법론.

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