Skip to content

Instantly share code, notes, and snippets.

@lukemetz
Created August 26, 2015 17:58
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save lukemetz/be6123c7ee3b366e333a to your computer and use it in GitHub Desktop.
Save lukemetz/be6123c7ee3b366e333a to your computer and use it in GitHub Desktop.
Image tsne scatter plot
from tsne import bh_sne
import numpy as np
from skimage.transform import resize
from matplotlib import pyplot as plt
def gray_to_color(img):
if len(img.shape) == 2:
img = np.dstack((img, img, img))
return img
def min_resize(img, size):
"""
Resize an image so that it is size along the minimum spatial dimension.
"""
w, h = map(float, img.shape[:2])
if min([w, h]) != size:
if w <= h:
img = resize(img, (int(round((h/w)*size)), int(size)))
else:
img = resize(img, (int(size), int(round((w/h)*size))))
return img
def image_scatter(features, images, img_res, res=4000, cval=1.):
"""
Embeds images via tsne into a scatter plot.
Parameters
---------
features: numpy array
Features to visualize
images: list or numpy array
Corresponding images to features. Expects float images from (0,1).
img_res: float or int
Resolution to embed images at
res: float or int
Size of embedding image in pixels
cval: float or numpy array
Background color value
Returns
------
canvas: numpy array
Image of visualization
"""
features = np.copy(features).astype('float64')
images = [gray_to_color(image) for image in images]
images = [min_resize(image, img_res) for image in images]
max_width = max([image.shape[0] for image in images])
max_height = max([image.shape[1] for image in images])
f2d = bh_sne(features)
xx = f2d[:, 0]
yy = f2d[:, 1]
x_min, x_max = xx.min(), xx.max()
y_min, y_max = yy.min(), yy.max()
# Fix the ratios
sx = (x_max-x_min)
sy = (y_max-y_min)
if sx > sy:
res_x = sx/float(sy)*res
res_y = res
else:
res_x = res
res_y = sy/float(sx)*res
canvas = np.ones((res_x+max_width, res_y+max_height, 3))*cval
x_coords = np.linspace(x_min, x_max, res_x)
y_coords = np.linspace(y_min, y_max, res_y)
for x, y, image in zip(xx, yy, images):
w, h = image.shape[:2]
x_idx = np.argmin((x - x_coords)**2)
y_idx = np.argmin((y - y_coords)**2)
canvas[x_idx:x_idx+w, y_idx:y_idx+h] = image
return canvas
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment