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):
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
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 thenoffX=k+(f*c*m)
. I think the sinus function takes the most time in your function.@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).
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).