This is the first time I'm diving a little deep into images and computer vision. I have an aerial image taken from a drone (I know the pitch, roll, yaw of the drone and the angle of the camera relative to north). How do I transform the image so that it looks as if it is taken from the top? I want to map latitude, longitude on the aerial image to pixels (I know the lat, lon of all four corners of the image) and my understanding is that I need to transform the image before I can interpolate and map a new lat,lng pair to pixels.
Suppose you're imaging a square with sides of length $d$, and you're a height $h \gg d$ above the square. You're tilted in one dimension by $\theta$. Then the center of the square appears displaced by $-h \sin \theta$ and its apparent width along that dimension is $d \cos \theta$, not $d$. So, what object would be imaged onto a single pixel of size $d_p$? It would need to be a rectangle, displaced from the image center by $h \sin \theta$. Its width along the tilted dimension would have to be $d / cos \theta$, but along the untilted dimension it should still be $d$.
So after correction, the image consists of rectangular pixels of width $d / \cos \theta$. There's no transform on the raw image data that will implement this directly. However, it's easy to write a function that will return the value of the image at a given lat/long.