Skip to content

Instantly share code, notes, and snippets.

@87091988
Forked from sfblake/pixel_mapper.py
Created August 1, 2020 17:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 87091988/2f6bdc1c4cd7c839393d68e4619a35a8 to your computer and use it in GitHub Desktop.
Save 87091988/2f6bdc1c4cd7c839393d68e4619a35a8 to your computer and use it in GitHub Desktop.
Class for performing pixel transformations
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