# Change pixel x,y location with mathematical function

As the title suggests, I have an image, whose pixels I want to move based on a mathematical function. The code I use right now is consisted of two loops. And because of the nested loop, the process takes forever, -to be exact more than two minutes most of the times-, having in mind that each image has 12000 pixels to run through the loops. Is there another way to do this? I looked through the documentation but couldn't find anything.

imgcor = np.zeros(img.shape, dtype=img.dtype)
for f in range(rowc):
for k in range(colc):
imgcor[f, k] = img[int(offY)%rowc, int(offX)%colc]


The a,b,c,d values are certain parameters that are assigned earlier in the script.

P.S. I am using Python2.7 and opencv 2.4

edit retag close merge delete

Normally an algorithm like this should be very fast. If you have constant parameters, try to precompute the most you can: m=b*math.sin(math.radians(a)), and then offX=k+(f*c*m). I think the sinus function takes the most time in your function.

( 2016-09-09 11:13:26 -0500 )edit

@kbarni Thanks for the reply! I thought about after I posted my question and tried it but the differences are -if not zero- at least very small (maybe less than a second).

( 2016-09-09 12:21:50 -0500 )edit

That's strange.

I implemented a similar method for optical corrections (two nested for loops) in C++. It has more complex operations to get the pixel coordinates.

I benchmarked it, it can process a huge 80 megapixel RGB photo in 250ms (1/4s) on my laptop.

Anyway, for further optimisations, you can parallelize the outer loop (I don't know how it's done in Python). My parallelized function processed the same image in 150ms (1/7s).

( 2016-09-12 08:47:59 -0500 )edit

Sort by ยป oldest newest most voted

Have a look at cv::remap

more

Official site

GitHub

Wiki

Documentation

## Stats

Seen: 111 times

Last updated: Sep 09 '16