def test_blind(): im = plt.imread('original/lena.bmp') gray = images.make_gray(im) gray = np.float64(gray) #h=convolves.gaussian(13,15,15) h = convolves.motion_blur(20, 30) #con=convolves.convolution2(gray, h) con = convolves.convolution2(gray, h) plt.imsave(fname='l_r_blind/real_h.bmp', arr=np.uint8(images.correct_image(h * 255)), cmap='gray') filt, new_h = filters.lucy_richardson_blind_deconvolution0_1( images.make0to1(con), 50, 1, images.make0to1(gray)) plt.imsave(fname='l_r_blind/new_lena.bmp', arr=np.uint8(images.correct_image(filt)), cmap='gray') plt.figure() plt.subplot(1, 5, 1) plt.imshow(gray, cmap='gray') plt.title('Original') plt.subplot(1, 5, 2) plt.imshow(np.uint8(images.correct_image(con)), cmap='gray') plt.title('Convoluton') plt.subplot(1, 5, 3) plt.imshow(np.uint8(images.correct_image(filt)), cmap='gray') plt.title('L-R blind\nn=20, m=10') plt.subplot(1, 5, 4) plt.imshow(h, cmap='gray') plt.title('PSF\ngaussian\nsigma=15, 13x13') plt.subplot(1, 5, 5) plt.imshow(new_h, cmap='gray') plt.title('new PSF') plt.show()
def test_l_r_graph(): im = plb.imread("original/my_bike.jpg") #h=convolves.motion_blur(20,30) gray = images.make_gray(im) h = convolves.gaussian(10, 15, 15) con = convolves.convolution(gray, h) #con, noise=convolves.add_normal_noise(con, 0, 1) start = time.time() print 'go' filt = filters.lucy_richardson_deconvolution(con, h, eps=0, original=gray, N=82) print 'end' end = time.time() f = filt #print im.shape, filt[:512,:512,:3].shape #print images.compare_images_rgb(im, f) print end - start #np.set_printoptions(threshold=np.nan) print con plt.figure() plt.subplot(1, 4, 1) plt.imshow(gray, cmap='gray') plt.title('original') plt.subplot(1, 4, 2) plt.imshow(np.uint8(images.correct_image(con)), cmap='gray') plt.title('Gaussian blur\nsigma=10, size=15x15\nnoise~N(0,1)') #plt.title('Motion blur\nlen=20, ang=30\nnoise~N(0,1)') plt.subplot(1, 4, 3) plt.imshow(np.uint8(images.correct_image(filt)), cmap='gray') #plt.title('Tikhonov regulerization\ngamma=1e-02') plt.title('Lucy-Richardson deconvolution\neps=5000') plt.subplot(1, 4, 4) plt.imshow(h, cmap='gray') plt.title('PSF') plt.show()
def test_pir(): im = plt.imread('original/lena.bmp') gray = images.make_gray(im) gray = np.float64(gray) h = convolves.gaussian(13, 15, 15) #h=convolves.motion_blur(20,30) #print 'real_h =',h #con=convolves.convolution2(gray, h) con = convolves.convolution(gray, h) plt.imsave(fname='l_r_blind/real_h.bmp', arr=np.uint8(images.correct_image(h * 255)), cmap='gray') filt, new_h = filters.lucy_richardson_blind_deconvolution_pir( con, 5, 1, 1, 501, 'gaussian', original=gray) #filt=images.correct_image(filt*255) plt.imsave(fname='l_r_blind/new_lena.bmp', arr=np.uint8(images.correct_image(filt)), cmap='gray') plt.figure() plt.subplot(1, 5, 1) plt.imshow(gray, cmap='gray') plt.title('Original') plt.subplot(1, 5, 2) plt.imshow(np.uint8(images.correct_image(con)), cmap='gray') plt.title('Convoluton') plt.subplot(1, 5, 3) plt.imshow(np.uint8(images.correct_image(filt)), cmap='gray') plt.title('L-R blind\nn=20, m=10') plt.subplot(1, 5, 4) plt.imshow(h, cmap='gray') plt.title('PSF\nmotion blur\nlen=20 ang=30') plt.subplot(1, 5, 5) plt.imshow(new_h, cmap='gray') plt.title('new PSF') #print images.compare_images(gray, con[:g]) #print images.compare_images(gray, filt) plt.show()
def lucy_richardson_blind_deconvolution_pir(g, n, m,d, max_psf_size=0, init_h_mode='gaussian', original=None): # g - blurred image # m, n - count of interation in RL-method # max_psf_size - How long must be PSF # init_h_mode - How initialize PSF: # 'gaussian' - gaussian PSF size = 3x3, sigma = # 'horizontal' - motion blur size 3x3, ang=0 # 'vertical' - motion blir size 3x3 ang = 90 # 'wow' - init with g plt.imsave(fname='l_r_blind/g.bmp', arr=np.uint8(g), cmap='gray') if max_psf_size==0: max_psf_size = min(g.shape[0], g.shape[1]) # # init h: # if init_h_mode=='gaussian': h = conv.gaussian(1,3,3) elif init_h_mode == 'horizontal': h = np.array([[0,0,0], [1,1,1], [0,0,0]], dtype=float)/3. elif init_h_mode == 'vertical': h =np.array([[0,1,0], [0,1,0], [0,1,0]], dtype=float)/3. elif init_h_mode == 'wow': mini_g=smisc.imresize(g, (3,3)) h = (1. / np.sum(mini_g) ** 2) * conv.correlation2(mini_g, mini_g) h /= np.sum(h) else: h = conv.random_psf(3,3) print h s=3 err=[] while (s<=max_psf_size): print 'size =',s mini_g=smisc.imresize(g, (s,s)) f = lucy_richardson_deconvolution(mini_g, h, 20000) if (s!=3): h=smisc.imresize(h, (s,s)) for k in range (d): if(k!=0): f = lucy_richardson_deconvolution(mini_g, h, 20000) for i in range(n): #f_prev = np.copy(f) #Correct h h_prev=np.copy(h) for k in range(m): p = mini_g / (conv.convolution2(f, h)) flr = np.fliplr(np.flipud(f)) h = conv.convolution2(p, flr)*h #h /= np.sum(h) #print 'h =',h for k in range(m): p = mini_g / (conv.convolution2(h_prev, f)) hlr = np.fliplr(np.flipud(h_prev)) f = conv.convolution2(p, hlr) * f print (float(i + 1) / n) * 100, ' %' name = 'l_r_blind/new_lena' +str(s)+'_'+ str(i) + '.bmp' h_name = 'l_r_blind/h_'+str(s)+'_' + str(i) + '.bmp' plt.imsave(fname=name, arr=np.uint8(images.correct_image(f)), cmap='gray') plt.imsave(fname=h_name, arr=np.uint8(images.correct_image(h*255)), cmap='gray') s=int(s*math.sqrt(2)) # if(original!=None): good_f = lucy_richardson_deconvolution(g, h, 20000) print good_f.shape dx = (good_f.shape[0]-original.shape[0])//2 dy = (good_f.shape[1]-original.shape[1])//2 err.append(images.compare_images(good_f[dx:original.shape[0]+dx, dy:original.shape[1] + dy], original)) err=np.array(err) plt.figure() plt.plot(np.arange(err.size), err) #plt.imshow(h,cmap='gray') plt.show() f = lucy_richardson_deconvolution(g, h, 5000) return f, h
def lucy_richardson_blind_deconvolution0_1(g, n, m, original): #init h print 'First error',images.compare_images(g, original) plt.imsave(fname='l_r_blind/g.bmp', arr=np.uint8(images.make0to255(g)), cmap='gray') #h1=conv.random_psf(3,3) # h1[1,:3]=1/3. ##h=np.zeros(g.shape, dtype=float) #h[255:258, 255:258]=h1 h = (1. / np.sum(g) ** 2) * conv.correlation2(g, g) h/=np.sum(h) #h=conv.random_psf(g.shape[0], g.shape[1]) #h/=np.sum(h) #h = conv.correlation2(g, g) # print np.sum(h) #h/=np.sum(h) plt.imsave(fname='l_r_blind/init_h.bmp', arr=np.uint8(images.make0to255(h)), cmap='gray') print 'h sum=', np.sum(h) #h[255:258, 255:258]=h1 f=np.copy(g) print 'blind l-r' print '0 %' errors=[] for i in range(n): f_prev=np.copy(f) #print 'h:' #print '-- 0 %' for k in range(m): p = g / (conv.convolution2(f, h)) flr=np.fliplr(np.flipud(f)) h=conv.convolution2(p,flr)*h h/=np.sum(f) #h/=np.sum(h) #h = (1. / np.sum(f)) * (h * conv.correlation2(f, p)) # p=g/(sg.convolve2d(f,h, mode='same')) # h=(1./np.sum(f))*(h*sg.correlate2d(f,p,mode='same')) #print '--', float(k+1) / m * 100, '%' # f=(1./np.sum(h))*(f*sg.correlate2d(h,p,mode='same')) # print 'f:' # print '-- 0 %' h /= np.sum(h) for k in range(m): p = g / (conv.convolution2(f, h)) hlr = np.fliplr(np.flipud(h)) f = conv.convolution2(p, hlr) * f # f = (1. / np.sum(h)) * (f * conv.correlation2(h, p)) # p=g/(sg.convolve2d(f,h, mode='same')) # print '--', float(k+1) / m * 100, '%' #images.check_image(f) print (float(i+1) / n) * 100, ' %' name='l_r_blind/new_lena'+str(i)+'.bmp' h_name='l_r_blind/h_'+str(i)+'.bmp' plt.imsave(fname=name, arr=np.uint8(images.make0to255(f)), cmap='gray') #print 't and f comp', images.compare_images(temp, f) plt.imsave(fname=h_name, arr=np.uint8(images.make0to255(h)), cmap='gray') images.check_image(images.correct_image(f)) error = images.compare_images(images.correct_image(f), original) errors.append(error) print 'err =',error errors=np.array(errors) plt.figure() plt.plot(np.arange(errors.size), errors) plt.xlabel('Steps') plt.ylabel('Dif btw original and f_k') plt.show() return f,h