stough 202-
In this quick demo I wanted to show how an image can be seen as a height-map, where the xy-plane is the domain of the image, while the z-axis represents the image intensity. This is easy enough with matplotlib's 3D plotting capability. Specifically I would refer you to the examples here.
%matplotlib widget
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from skimage import color
# For importing from alternative directory sources
import sys
sys.path.insert(0, '../dip_utils')
from matrix_utils import arr_info
from vis_utils import vis_image
I = color.rgb2gray(plt.imread('../dip_pics/D_image.jpg'))
arr_info(I)
vis_image(I, cmap='gray')
X, Y = np.meshgrid(range(0,I.shape[0]), range(0,I.shape[1]), indexing='ij')
fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, I, cmap=cm.coolwarm);
The argument projection='3d'
means the ax
returned is a Axes3D object. We then call that object's plot_surface
method with a colormap so that the colors change as a function of the image intensity, or z coordinate.
Note also that 3D plotting normalizes the units for a square output, even while the original image may not be. Lastly, code that does this surface plotting has been added to vis_utils if we need it in the future.