import numpy def convolve(I1, I2): rows_I1 = I1.shape[0] cols_I1 = I1.shape[1] rows_I2 = I2.shape[0] cols_I2 = I2.shape[1] assert numpy.mod(rows_I2, 2)==1, "only uneven image size supported" assert numpy.mod(cols_I2, 2)==1, "only uneven image size supported" I2 = I2[::-1, ::-1] I = numpy.zeros((rows_I1 + 2 * (rows_I2/2), cols_I1 + 2 * (cols_I2/2))) I[rows_I2/2:-rows_I2/2+1, cols_I2/2:-cols_I2/2+1] = I1 out = numpy.zeros_like(I) for i in range(rows_I2/2, I.shape[0]-rows_I2/2): for j in range(cols_I2/2, I.shape[1]-cols_I2/2): out[i, j] = (I[i-rows_I2/2:i+rows_I2/2+1, j-cols_I2/2:j+cols_I2/2+1] * I2 ).sum() return out[rows_I2/2:-rows_I2/2+1, cols_I2/2:-cols_I2/2+1]