-
-
Save 87091988/2f6bdc1c4cd7c839393d68e4619a35a8 to your computer and use it in GitHub Desktop.
Class for performing pixel transformations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
import cv2 | |
class PixelMapper(object): | |
""" | |
Create an object for converting pixels to geographic coordinates, | |
using four points with known locations which form a quadrilteral in both planes | |
Parameters | |
---------- | |
pixel_array : (4,2) shape numpy array | |
The (x,y) pixel coordinates corresponding to the top left, top right, bottom right, bottom left | |
pixels of the known region | |
lonlat_array : (4,2) shape numpy array | |
The (lon, lat) coordinates corresponding to the top left, top right, bottom right, bottom left | |
pixels of the known region | |
""" | |
def __init__(self, pixel_array, lonlat_array): | |
assert pixel_array.shape==(4,2), "Need (4,2) input array" | |
assert lonlat_array.shape==(4,2), "Need (4,2) input array" | |
self.M = cv2.getPerspectiveTransform(np.float32(pixel_array),np.float32(lonlat_array)) | |
self.invM = cv2.getPerspectiveTransform(np.float32(lonlat_array),np.float32(pixel_array)) | |
def pixel_to_lonlat(self, pixel): | |
""" | |
Convert a set of pixel coordinates to lon-lat coordinates | |
Parameters | |
---------- | |
pixel : (N,2) numpy array or (x,y) tuple | |
The (x,y) pixel coordinates to be converted | |
Returns | |
------- | |
(N,2) numpy array | |
The corresponding (lon, lat) coordinates | |
""" | |
if type(pixel) != np.ndarray: | |
pixel = np.array(pixel).reshape(1,2) | |
assert pixel.shape[1]==2, "Need (N,2) input array" | |
pixel = np.concatenate([pixel, np.ones((pixel.shape[0],1))], axis=1) | |
lonlat = np.dot(self.M,pixel.T) | |
return (lonlat[:2,:]/lonlat[2,:]).T | |
def lonlat_to_pixel(self, lonlat): | |
""" | |
Convert a set of lon-lat coordinates to pixel coordinates | |
Parameters | |
---------- | |
lonlat : (N,2) numpy array or (x,y) tuple | |
The (lon,lat) coordinates to be converted | |
Returns | |
------- | |
(N,2) numpy array | |
The corresponding (x, y) pixel coordinates | |
""" | |
if type(lonlat) != np.ndarray: | |
lonlat = np.array(lonlat).reshape(1,2) | |
assert lonlat.shape[1]==2, "Need (N,2) input array" | |
lonlat = np.concatenate([lonlat, np.ones((lonlat.shape[0],1))], axis=1) | |
pixel = np.dot(self.invM,lonlat.T) | |
return (pixel[:2,:]/pixel[2,:]).T |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment