├── Example.ipynb ├── Image fusion with guided filtering.pdf ├── images ├── sbug00.png ├── sbug01.png ├── sbug02.png ├── sbug03.png ├── sbug04.png ├── sbug05.png ├── sbug06.png ├── sbug07.png ├── sbug08.png ├── sbug09.png ├── sbug10.png ├── sbug11.png └── sbug12.png └── utils ├── __init__.py ├── __pycache__ ├── __init__.cpython-37.pyc ├── image.cpython-37.pyc └── scipy_guided_filter.cpython-37.pyc ├── filters_gray.py ├── image.py ├── implemented_guidedFilter.py └── scipy_guided_filter.py /Image fusion with guided filtering.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/Image fusion with guided filtering.pdf -------------------------------------------------------------------------------- /images/sbug00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug00.png -------------------------------------------------------------------------------- /images/sbug01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug01.png -------------------------------------------------------------------------------- /images/sbug02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug02.png -------------------------------------------------------------------------------- /images/sbug03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug03.png -------------------------------------------------------------------------------- /images/sbug04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug04.png -------------------------------------------------------------------------------- /images/sbug05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug05.png -------------------------------------------------------------------------------- /images/sbug06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug06.png -------------------------------------------------------------------------------- /images/sbug07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug07.png -------------------------------------------------------------------------------- /images/sbug08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug08.png -------------------------------------------------------------------------------- /images/sbug09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug09.png -------------------------------------------------------------------------------- /images/sbug10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug10.png -------------------------------------------------------------------------------- /images/sbug11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug11.png -------------------------------------------------------------------------------- /images/sbug12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/images/sbug12.png -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Fri Sep 28 21:26:35 2018 4 | 5 | @author: ASUS 6 | """ 7 | 8 | -------------------------------------------------------------------------------- /utils/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/utils/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /utils/__pycache__/image.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/utils/__pycache__/image.cpython-37.pyc -------------------------------------------------------------------------------- /utils/__pycache__/scipy_guided_filter.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RCharradi/Image-fusion-with-guided-filtering/d3a97f3cc99833d14d6e98bb426aada381aa90d5/utils/__pycache__/scipy_guided_filter.cpython-37.pyc -------------------------------------------------------------------------------- /utils/filters_gray.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Fri Sep 28 21:29:16 2018 4 | 5 | @author: Ramzi Charradi 6 | """ 7 | from scipy.ndimage.filters import laplace 8 | from scipy.ndimage import uniform_filter, gaussian_filter 9 | import numpy as np 10 | np.seterr(divide='ignore', invalid='ignore') 11 | 12 | # Algorithm using the implemented guided Filter for gray_scale images 13 | 14 | def padding(im,r): 15 | return np.pad(im,((r, r),(r, r)), 'reflect') 16 | 17 | def guided_filter(im,guide,r,epsilone): 18 | im = np.array(im, np.float32) 19 | a = np.zeros((im.shape[0],im.shape[1]), np.float32) 20 | b = np.zeros((im.shape[0],im.shape[1]), np.float32) 21 | O = np.array(im, np.float32, copy=True) 22 | im=padding(im,r) 23 | guide=padding(guide,r) 24 | n=np.shape(im)[0] 25 | m=np.shape(im)[1] 26 | a_k = np.zeros((n,m), np.float32) 27 | b_k = np.zeros((n,m), np.float32) 28 | w=2*r+1 29 | for i in range(r,n-r): 30 | for j in range(r,m-r): 31 | I=guide[i-r:i+r+1 ,j-r:j+r+1 ] 32 | P=im[i-r:i+r+1 ,j-r:j+r+1 ] 33 | mu_k = np.mean(I) 34 | delta_k = np.var(I) 35 | P_k_bar = np.mean(P) 36 | somme = np.dot(np.ndarray.flatten(I), np.ndarray.flatten(P))/(w**2) 37 | a_k[i,j] = (somme - mu_k * P_k_bar) / (delta_k + epsilone) 38 | b_k[i,j] = P_k_bar - a_k[i,j] * mu_k 39 | a=a_k[r:n-r+1,r:m-r+1] 40 | b=b_k[r:n-r+1,r:m-r+1] 41 | a=padding(a,r) 42 | b=padding(b,r) 43 | for i in range(r, n-r): 44 | for j in range(r, m-r): 45 | a_k_bar = a[i-r : i+r+1, j-r : j+r+1].sum()/(w*w) 46 | b_k_bar = b[i-r : i+r+1, j-r : j+r+1].sum()/(w*w) 47 | O[i-r,j-r] = a_k_bar * guide[i,j] + b_k_bar 48 | return O 49 | 50 | 51 | 52 | def fusion(im1,im2): 53 | sigma_r = 5 54 | average_filter_size=31 55 | r_1=45 56 | r_2=7 57 | eps_1=0.3 58 | eps_2=1e-6 59 | 60 | 61 | if im1.max()>1: 62 | im1=im1/255 63 | if im2.max()>1: 64 | im2=im2/255 65 | 66 | base_layer1 = uniform_filter(im1, mode='reflect',size=average_filter_size) 67 | base_layer2 = uniform_filter(im2, mode='reflect',size=average_filter_size) 68 | 69 | 70 | detail_layer1 = im1 - base_layer1 71 | detail_layer2 = im2 - base_layer2 72 | 73 | saliency1 = gaussian_filter(abs(laplace(im1,mode='reflect')), sigma_r,mode='reflect') 74 | saliency2 = gaussian_filter(abs(laplace(im2,mode='reflect')),sigma_r,mode='reflect') 75 | 76 | mask = np.argmax([saliency1, saliency2], axis=0) 77 | 78 | g1r1 = guided_filter(1 - mask , im1, r_1, eps_1) 79 | g2r1 = guided_filter(mask, im2, r_1, eps_1) 80 | g1r2 = guided_filter(1 - mask, im1, r_2, eps_2) 81 | g2r2 = guided_filter(mask, im2 , r_2, eps_2) 82 | 83 | fused_base = (base_layer1 * (g1r1) + base_layer2 * (g2r1))/(g1r1+g2r1) 84 | fused_detail = (detail_layer1 * (g1r2) + detail_layer2 * (g2r2))/(g1r2+g2r2) 85 | 86 | fusion = fused_base + fused_detail 87 | 88 | 89 | return fusion -------------------------------------------------------------------------------- /utils/image.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @author: ASUS 4 | """ 5 | 6 | import numpy as np 7 | from matplotlib import pyplot as plt 8 | from scipy.misc import toimage 9 | plt.rcParams['figure.figsize'] = (14, 8) 10 | 11 | 12 | 13 | def rgb2gray(img): 14 | w = np.array([0.2989, 0.5870, 0.1140]).reshape((1, 1, -1)) 15 | return (img * w).sum(axis=2) 16 | 17 | def rgba2gray(img): 18 | w = np.array([0.2989, 0.5870, 0.1140, 0.0]).reshape((1, 1, -1)) 19 | return (img * w).sum(axis=2) 20 | 21 | def imshow(img): 22 | if len(img.shape) == 2 or img.shape[2] == 1: 23 | if img.dtype == np.dtype('int'): 24 | f = plt.imshow(img, cmap='gray', clim=(0, 255)) 25 | else: 26 | f = plt.imshow(img, cmap='gray') 27 | else: 28 | f = plt.imshow(img) 29 | plt.show() 30 | return f 31 | 32 | 33 | def imwrite(filename, matrix): 34 | toimage(matrix, cmin=0, cmax=256).save(filename) 35 | 36 | 37 | -------------------------------------------------------------------------------- /utils/implemented_guidedFilter.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Fri Sep 28 21:29:16 2018 4 | 5 | @author: Ramzi Charradi 6 | """ 7 | 8 | # Algorithm using the implemented guided Filter 9 | 10 | 11 | from scipy.ndimage.filters import laplace 12 | from scipy.ndimage import uniform_filter, gaussian_filter 13 | import numpy as np 14 | import cv2 15 | np.seterr(divide='ignore', invalid='ignore') 16 | 17 | def padding(im,r): 18 | return np.pad(im,((r, r),(r, r)), 'reflect') 19 | 20 | def guided_filter(im,guide,r,epsilone): 21 | im = np.array(im, np.float32) 22 | a = np.zeros((im.shape[0],im.shape[1]), np.float32) 23 | b = np.zeros((im.shape[0],im.shape[1]), np.float32) 24 | O = np.array(im, np.float32, copy=True) 25 | im=padding(im,r) 26 | guide=padding(guide,r) 27 | n=np.shape(im)[0] 28 | m=np.shape(im)[1] 29 | a_k = np.zeros((n,m), np.float32) 30 | b_k = np.zeros((n,m), np.float32) 31 | w=2*r+1 32 | for i in range(r,n-r): 33 | for j in range(r,m-r): 34 | I=guide[i-r:i+r+1 ,j-r:j+r+1 ] 35 | P=im[i-r:i+r+1 ,j-r:j+r+1 ] 36 | mu_k = np.mean(I) 37 | delta_k = np.var(I) 38 | P_k_bar = np.mean(P) 39 | somme = np.dot(np.ndarray.flatten(I), np.ndarray.flatten(P))/(w**2) 40 | a_k[i,j] = (somme - mu_k * P_k_bar) / (delta_k + epsilone) 41 | b_k[i,j] = P_k_bar - a_k[i,j] * mu_k 42 | a=a_k[r:n-r+1,r:m-r+1] 43 | b=b_k[r:n-r+1,r:m-r+1] 44 | a=padding(a,r) 45 | b=padding(b,r) 46 | for i in range(r, n-r): 47 | for j in range(r, m-r): 48 | a_k_bar = a[i-r : i+r+1, j-r : j+r+1].sum()/(w*w) 49 | b_k_bar = b[i-r : i+r+1, j-r : j+r+1].sum()/(w*w) 50 | O[i-r,j-r] = a_k_bar * guide[i,j] + b_k_bar 51 | return O 52 | 53 | def fusion(im1,im2): 54 | 55 | sigma_r = 5 56 | average_filter_size=31 57 | r_1=45 58 | r_2=7 59 | eps_1=0.3 60 | eps_2=10e-6 61 | 62 | if im1.max()>1: 63 | im1=im1/255 64 | if im2.max()>1: 65 | im2=im2/255 66 | 67 | im1_blue, im1_green, im1_red = cv2.split(im1) 68 | im2_blue, im2_green, im2_red = cv2.split(im2) 69 | 70 | base_layer1 = uniform_filter(im1, mode='reflect',size=average_filter_size) 71 | b1_blue, b1_green, b1_red = cv2.split(base_layer1) 72 | 73 | base_layer2 = uniform_filter(im2, mode='reflect',size=average_filter_size) 74 | b2_blue, b2_green, b2_red = cv2.split(base_layer2) 75 | 76 | detail_layer1 = im1 - base_layer1 77 | d1_blue, d1_green, d1_red = cv2.split(detail_layer1) 78 | 79 | detail_layer2 = im2 - base_layer2 80 | d2_blue, d2_green, d2_red = cv2.split(detail_layer2) 81 | 82 | 83 | saliency1 = gaussian_filter(abs(laplace(im1_blue+im1_green+im1_red,mode='reflect')),sigma_r,mode='reflect') 84 | saliency2 = gaussian_filter(abs(laplace(im2_blue+im2_green+im2_red,mode='reflect')),sigma_r,mode='reflect') 85 | mask = np.float32(np.argmax([saliency1, saliency2], axis=0)) 86 | 87 | im1=np.float32(im1) 88 | im2=np.float32(im2) 89 | 90 | g1r1 = guided_filter(1 - mask, im1[:,:,0], r_1, eps_1)+guided_filter(1 - mask, im1[:,:,1], r_1, eps_1)+guided_filter(1 - mask, im1[:,:,2], r_1, eps_1) 91 | 92 | g2r1 = guided_filter(mask, im2[:,:,0], r_1, eps_1)+guided_filter(mask, im2[:,:,1], r_1, eps_1)+guided_filter(mask, im2[:,:,2], r_1, eps_1) 93 | g1r2 = guided_filter(1 - mask, im1[:,:,0], r_2, eps_2)+ guided_filter(1 - mask, im1[:,:,1], r_2, eps_2)+ guided_filter(1 - mask, im1[:,:,2], r_2, eps_2) 94 | g2r2 = guided_filter(mask, im2[:,:,0], r_2, eps_2)+ guided_filter(1 - mask, im2[:,:,1], r_2, eps_2)+ guided_filter(1 - mask, im2[:,:,2], r_2, eps_2) 95 | 96 | 97 | fused_base1 = np.float32((b1_blue * (g1r1) + b2_blue * (g2r1))/((g1r1+g2r1))) 98 | fused_detail1 = np.float32((d1_blue * (g1r2) + d2_blue * (g2r2))/((g1r2+g2r2))) 99 | fused_base2 = np.float32((b1_green * g1r1 + b2_green * g2r1)/((g1r1+g2r1))) 100 | fused_detail2 = np.float32((d1_green * (g1r2) + d2_green * (g2r2))/((g1r2+g2r2))) 101 | fused_base3 = np.float32((b1_red * (g1r1) + b2_red * (g2r1))/((g1r1+g2r1))) 102 | fused_detail3 = np.float32((d1_red * (g1r2) + d2_red * (g2r2))/((g1r2+g2r2))) 103 | 104 | 105 | B1=np.float32(fused_base1+fused_detail1) 106 | B2=np.float32(fused_base2+fused_detail2) 107 | B3=np.float32(fused_base3+fused_detail3) 108 | 109 | fusion1=np.float32(cv2.merge((B1, B2, B3))) 110 | fusion1=fusion1/fusion1.max() 111 | return fusion1 -------------------------------------------------------------------------------- /utils/scipy_guided_filter.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Fri Sep 28 21:29:16 2018 4 | 5 | @author: Ramzi Charradi 6 | """ 7 | from scipy.ndimage.filters import laplace 8 | from scipy.ndimage import uniform_filter, gaussian_filter 9 | import numpy as np 10 | import cv2 11 | np.seterr(divide='ignore', invalid='ignore') 12 | 13 | 14 | # Algorithm using scipy's guided Filter 15 | 16 | def fusion(im1,im2): 17 | sigma_r = 5 18 | average_filter_size=31 19 | r_1=45 20 | r_2=7 21 | eps_1=0.3 22 | eps_2=10e-6 23 | 24 | 25 | if im1.max()>1: 26 | im1=im1/255 27 | if im2.max()>1: 28 | im2=im2/255 29 | 30 | im1_blue, im1_green, im1_red = cv2.split(im1) 31 | im2_blue, im2_green, im2_red = cv2.split(im2) 32 | 33 | base_layer1 = uniform_filter(im1, mode='reflect',size=average_filter_size) 34 | b1_blue, b1_green, b1_red = cv2.split(base_layer1) 35 | 36 | base_layer2 = uniform_filter(im2, mode='reflect',size=average_filter_size) 37 | b2_blue, b2_green, b2_red = cv2.split(base_layer2) 38 | 39 | detail_layer1 = im1 - base_layer1 40 | d1_blue, d1_green, d1_red = cv2.split(detail_layer1) 41 | 42 | detail_layer2 = im2 - base_layer2 43 | d2_blue, d2_green, d2_red = cv2.split(detail_layer2) 44 | 45 | 46 | saliency1 = gaussian_filter(abs(laplace(im1_red+im1_green+im1_blue,mode='reflect')),sigma_r,mode='reflect') 47 | saliency2 = gaussian_filter(abs(laplace(im2_red+im2_green+im2_blue,mode='reflect')),sigma_r,mode='reflect') 48 | mask = np.float32(np.argmax([saliency1, saliency2], axis=0)) 49 | 50 | im1=np.float32(im1) 51 | im2=np.float32(im2) 52 | 53 | gf1 = cv2.ximgproc.createGuidedFilter(im1, r_1, eps_1) 54 | gf2 = cv2.ximgproc.createGuidedFilter(im2, r_1, eps_1) 55 | gf3 = cv2.ximgproc.createGuidedFilter(im1, r_2, eps_2) 56 | gf4 = cv2.ximgproc.createGuidedFilter(im2, r_2, eps_2) 57 | 58 | g1r1 = gf1.filter(1 - mask) 59 | g2r1 = gf2.filter(mask) 60 | g1r2 = gf3.filter(1-mask) 61 | g2r2 = gf4.filter(mask) 62 | 63 | fused_base1 = np.float32((b1_blue * (g1r1) + b2_blue * (g2r1))/((g1r1+g2r1))) 64 | fused_detail1 = np.float32((d1_blue * (g1r2) + d2_blue * (g2r2))/((g1r2+g2r2))) 65 | fused_base2 = np.float32((b1_green * g1r1 + b2_green * g2r1)/((g1r1+g2r1))) 66 | fused_detail2 = np.float32((d1_green * (g1r2) + d2_green * (g2r2))/((g1r2+g2r2))) 67 | fused_base3 = np.float32((b1_red * (g1r1) + b2_red * (g2r1))/((g1r1+g2r1))) 68 | fused_detail3 = np.float32((d1_red * (g1r2) + d2_red * (g2r2))/((g1r2+g2r2))) 69 | 70 | 71 | B1=np.float32(fused_base1+fused_detail1) 72 | B2=np.float32(fused_base2+fused_detail2) 73 | B3=np.float32(fused_base3+fused_detail3) 74 | 75 | fusion1=np.float32(cv2.merge((B1, B2, B3))) 76 | fusion1=fusion1/fusion1.max() 77 | return fusion1 --------------------------------------------------------------------------------