Attention! This forum will be made read-only by Dec-20. Please migrate to Most of existing active users should've received invitation by e-mail.
Ask Your Question

Change pixel x,y location with mathematical function

asked 2016-09-09 09:47:39 -0500

n.argirop gravatar image

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):
                        offX = k + (f*b*c*(math.sin(math.radians(a))))
                        offY = f + (f*b*d*(math.cos(math.radians(a))))
                        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 flag offensive 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.

kbarni gravatar imagekbarni ( 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).

n.argirop gravatar imagen.argirop ( 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).

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

1 answer

Sort by ยป oldest newest most voted

answered 2016-09-09 13:35:35 -0500

Have a look at cv::remap

edit flag offensive delete link more
Login/Signup to Answer

Question Tools

1 follower


Asked: 2016-09-09 09:47:39 -0500

Seen: 97 times

Last updated: Sep 09 '16