As an example I use images from middleburry. Solution is very dirty and slow.

[https://github.com/serge-m/depth_map_occlusion](https://github.com/serge-m/depth_map_occlusion" target="_blank)

# In[1]:

import numpy import scipy import matplotlib.pyplot as plt

In[2]:

from scipy import ndimage import numpy as np

kernels for shift

k = np.array([ [[0,0,0],  [0,0,1],  [0,0,0],], [[0,1,0],  [0,0,0],  [0,0,0],], [[0,0,0],  [1,0,0],  [0,0,0],], [[0,0,0],  [0,0,0],  [0,1,0],], [[1,0,0],  [0,0,0],  [0,0,0],], [[0,0,1],  [0,0,0],  [0,0,0],], [[0,0,0],  [0,0,0],  [0,0,1],], [[0,0,0],  [0,0,0],  [1,0,0],], ])

In[8]:

from scipy import misc

from PIL import Image

#reading source data frm = misc.imread(‘cones_2_6_align2_00000.png’) dpt0 = misc.imread(‘disp2.png’) occl0 = misc.imread(‘occl.png’)

#initial values for results dpt = dpt0 occl = occl0

frm_shifterd = numpy.zeros((len(k),)+frm.shape) dif = numpy.zeros((len(k),)+frm.shape) sumdiff = numpy.zeros((len(k),)+frm.shape[:-1])

for ik in range(len(k)):     for ch in range(frm.shape[-1]):         frm_shifterd[ik,:,:,ch] = ndimage.convolve(frm[:,:,ch], k[ik], mode=‘nearest’, cval=0.0)     dif[ik] = numpy.abs(frm_shifterd[ik,:,:,:]-frm[:,:,:])     sumdiff[ik] = dif[ik].sum(axis=2)    

iteration = 0

def one_iteration(dpt, occl, k, sumdiff):     dpt_shifted = numpy.zeros((len(k),)+dpt.shape)     occl_shifted = numpy.zeros((len(k),)+dpt.shape)     sumdiff_final = numpy.zeros((len(k),)+frm.shape[:-1])

        occl_dil = ndimage.grey_dilation(occl, size=(3,3))     for ik in range(len(k)):         dpt_shifted[ik,:,:] = ndimage.convolve(dpt[:,:], k[ik], mode=‘nearest’, cval=0.0)             occl_shifted[ik,:,:] = ndimage.convolve(occl[:,:], k[ik], mode=‘nearest’, cval=0.0)         sumdiff_final[ik] = sumdiff[ik] + (1-occl_shifted[ik])*1000000000         #print ‘shifted’, ik, ‘\n’, dpt_shifted[ik]             # chose direction where the difference is the lowest     good_directions = numpy.argmin(sumdiff_final, axis = 0)     dpt_best = numpy.choose( good_directions, dpt_shifted )         dpt_new = numpy.choose( occl==occl_dil, numpy.array([dpt_best,dpt]))         return dpt_new, occl_dil

while True:     iteration += 1         dpt_new, occl_dil = one_iteration(dpt, occl, k, sumdiff)         if numpy.array_equal(occl, occl_dil):         break;         #Image.fromarray(np.cast‘uint8’).save(‘dpt_{}.png’.format(iteration))

            dpt = numpy.copy(dpt_new)     occl = numpy.copy(occl_dil)     #write output Image.fromarray(np.cast‘uint8’).save(‘processed_dpt.png’)