目が悪い人にしか見えない画像を復元してみるよ!Part2

いつかの記事http://d.hatena.ne.jp/aki33524/20120310/1331384580の続編

import Image
import math
from sets import Set

def show_rem():
    for i in range(len(rem_list)):
        print rem_list[i]
         
def rem_noise(point):
    r, g, b = im.getpixel(point)
    euclid = math.sqrt(r**2 + g**2 + b**2)
    if(euclid < 200 ):
        rem_list.append(point)
        dump1.putpixel(point, (255, 0, 0))
        dump2.putpixel(point, (255, 255, 255))

def num_of_NP((x, y)):
    sum = 0
    for i in (-1, 0, 1):
        for j in (-1, 0, 1):
            if (x+i, y+j) in set_rem_list:
                sum += 1
    return sum

def adj_color(point):
    r, g, b = im.getpixel(point)
    r = 255-(255-r)*10
    g = 255-(255-g)*10
    b = 255-(255-b)*10
    dump2.putpixel(point, (r, g, b))

def interpolation((x, y)):
    num = 0
    if 0<x and x+1<w and 0<y and y+1<h:
        list1 = []        
        for i in (-1, 0, 1):
            for j in (-1, 0, 1):
                if not (x+i, y+j) in set_rem_list:
                    num += 1
                    list1.append((x+i, y+j))
    if 1<num:
        r = 0
        g = 0
        b = 0
        for point in list1:
            r += dump2.getpixel(point)[0]
            g += dump2.getpixel(point)[1]
            b += dump2.getpixel(point)[2]
        rem_list.remove((x, y))
        dump2.putpixel((x, y), (r/num, g/num, b/num))
    
'''''''''''''''''''''''
Entory POINT
'''''''''''''''''''''''
rem_list = []
tmp_list = []
im = Image.open("youjo.bmp", 'r')
w, h = im.size
dump1 = Image.new("RGB", im.size)
dump2 = im.copy()
dump3 = im.copy()

'''
Remove noise and adjust
'''
for i in range(w):
    for j in range(h):
        rem_noise((i, j))
        adj_color((i, j))
'''
Remove noise 2
'''
set_rem_list = Set(rem_list)
for i in range(1, w-1):
    for j in range(1, h-1):
        point = (i, j)
        if num_of_NP(point) > 2:
            rem_list.append(point)
            dump1.putpixel(point, (255, 0, 0))
            dump2.putpixel(point, (255, 255, 255))
'''
for point in rem_list:
    dump2.putpixel(point, (255, 255, 0))
'''
            
set_rem_list = Set(rem_list)   
while 2000<len(rem_list):
    for point in rem_list:
        interpolation(point)        
    set_rem_list = Set(rem_list)
    print "len(rem_list):",len(rem_list)
print "end"
       
dump1.save("dump1.bmp")
dump2.save("dump2.bmp")

前回に比べてかなりソースが見やすくなったと思う。
このソースを書いてる時に、setsの存在を知って心が折れたので更新する。

dump1.bmp

dump2.bmp

さて、このプログラムListを使って色々しているが、非常に効率が悪い。実行終了まで一時間ほど掛かる。
かなりいい加減な作りだったりして考えたアルゴリズムになってない途中段階な感じ。
結局まだ未完なんで早いところPart3作りたい。

前に作ったのがこれ。

見比べると多少綺麗になった気もする