Interpolation issues at the edges with inpaint from openCV

Viewed 40

I tried interpolating not-a-number (nan) pixels in a scan with inpaint from opencv. This worked fine in the bulk of the image, but nan pixels at the edges of the image remained nan pixels.

Here is a minimal python example to reproduce the problem:

import numpy as np
import cv2 as cv

if __name__ == '__main__':
    input = np.zeros((6,6))
    input[1, 3] = np.nan
    input = np.float32(input)
    mask = np.uint8(input != 0)
    inpaintRadius = 2
    inpaintAlgorithm = cv.INPAINT_NS
    output = cv.inpaint(input, mask, inpaintRadius, inpaintAlgorithm)
    print(output)

This gives the output:

[[ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0. nan  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]]

As the nan pixel is interpolated with the Navier-Stokes equation, the correct solution is the equilibrium state. Therefore, I would expect and want for the output.

expected output:

[[ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.]]

If I relocate the nan from [1, 3] to [2, 3], then I obtain the expected output.

Does someone know, how inpaint from openCV handels the edges and what is the appropriate way to interpolate the edges?

0 Answers
Related