miceuz
miceuz

Reputation: 3387

How do i fill "holes" in an image?

I have photo images of galaxies. There are some unwanted data on these images (like stars or aeroplane streaks) that are masked out. I don't just want to fill the masked areas with some mean value, but to interpolate them according to surrounding data. How do i do that in python?

We've tried various functions in SciPy.interpolate package: RectBivariateSpline, interp2d, splrep/splev, map_coordinates, but all of them seem to work in finding new pixels between existing pixels, we were unable to make them fill arbitrary "hole" in data.

Upvotes: 7

Views: 6641

Answers (3)

Christian
Christian

Reputation: 11

I made my first gimp python script that might help you: my scripts

It is called conditional filter as it is a matrix filter that fill all transparent pixels from an image according to the mean value of its 4 nearest neighbours that are not transparent. Be sure to use a RGBA image with only 0 and 255 transparent values.

Its is rough, simple, slow, unoptimized but bug free.

Upvotes: 1

Adi Shavit
Adi Shavit

Reputation: 17285

What you want is called Inpainting.
OpenCV has an inpaint() function that does what you want.

Upvotes: 8

Swiss
Swiss

Reputation: 5829

What you want is not interpolation at all. Interpolation depends on the assumption that data between known points is roughly contiguous. In any non-trivial image, this will not be the case.

You actually want something like the content-aware fill that is in Photoshop CS5. There is a free alternative available in The GIMP through the GIMP-resynthesize plugin. These filters are extremely advanced and to try to re-implement them is insane. A better choice would be to figure out how to use GIMP-resynthesize in your program instead.

Upvotes: 2

Related Questions