Visualization tips for geoscientists – Matlab

Introduction

In my last post I described how to create a powerful, nondirectional shading for a geophysical surface using the slope of the data to assign the shading intensity (i.e. areas of greater slope are assigned darker shading). Today I will show hot to create a similar effect in Matlab.

Since the data set I use is from my unpublished thesis in Geology, I am not able to share it, and you will have to use your own data, but the Matlab code is simply adapted. The code snippets below assume you have a geophysical surface already imported in the workspace and stored in a variable called “data”, as well as the derivative in a variable called “data_slope”.

Method 1 – with a slope mask and transparency

Some time ago I read this interesting Image Processing blog post by Steve Eddins at Mathworks on overlaying images using transparency. I encourage readers to take a look at this and other posts by Steve, he’s great! That particular blog post gave me the idea to use transparency and the slope to create my favorite shading in Matlab.

In addition to the code below you will need normalise.m from Peter Kovesi‘s website, and to import the color palette cube1.

%% alpha transparency code snippet
black = cat(3, zeros(size(data)), zeros(size(data)), ...
    zeros(size(data)));             % make a truecolor all-black image
gray=black+0.2;                     % make a truecolor all-gray image
alphaI=normalise(data_slope);       % create transparency weight matrix
                                    % using data_slope

imagesc(data);colormap(cube1);      % display data
hold on
h = imagesc(gray);                  % overlay gray image on data
hold off
set(h, 'AlphaData', alphaI);        % set transparency of gray layer using
axis equal;                         % weight matrix
axis tight;
axis off;

And here is the result in Figure 1 below – not bad!

Figure 1. Shaded using transparency

Method 2 – using Shaded Pseudo Color

You will need shadedpcolor.m, a function by Jody Klymak available on the Matlab File Exchange, and again normalise.m and cube1.

%% shadedpcolor code snippet
 figure;
 shadedpcolor(xe,ye,data,(1-normalise(data_slope)),[-5.9834 2.9969], ...
      [0 1],0.55,cube1,0);
 axis equal; axis off; axis tight
 shadedcolorbar([-5.9834 2.9969],0.55,cube1);

The result is in Figure 2. This really looks good. I favor this over the code above it now all the time because it allows greater flexibility (for example shading brightness adjustment), and because it creates a shaded colorbar for you.

Figure 2. Shaded using shadedpcolor

Method 3: 3D

I am trying to write some code to use transparency to apply he shading with the surf command. Another option to generate a real 3D effect much like the one shown in the last post in Surfer I use imageshiny.m, a function by Gordon Cooper available on the Matlab File Exchange. This function will create both a 2D map like the ones above and a 3D map. The 3D map for the gravity data is shown below in Figure 3.

Notice that for imageshiny to work properly you will have to replace all instances of imshow with imagesc in the code if you do not have the Image Processing Toolbox.

Figure 3. Plotted and shaded using imageshiny

It is actually very interesting to look at the ingenious solution the author of imageshiny came up with to assign the shading. When you run imageshiny, each pixel in the surface is assigned simultaneously color and shading. This is done by generating a new matrix of HSV triplets (refer to wikipedia for a review of HSV and HSL) using the data directly: the hue H is assigned with  the data (normalized to the interval 0.5 to 1 so as to translate in the color range green to red); saturation S and value V are both assigned using the slope (imageshiny calculates it for you on the fly). The new matrix HSV is then converted to a matrix of RGB triplets, and the latter is used to color the surface when using the surf command. Here below is the relevant code, modified to facilitate reading (data* is the normalized data, slope* is the calculated slope, to distinguish from the variables in my code snippets above):

HSV(:,:,1)=1-data*; HSV(:,:,2)=1-slope*; HSV(:,:,3)=slope*;
RGB=hsv2rgb(HSV);
figure; clf;
surf(data,RGB);axis off; axis tight; shading flat; view(5,85);

I am currently experimenting to see  if I can make this function work with different hue combinations.

Contours

I am still working at figuring out the right approach and write my own code to drape contours over the surface in 3D. This is actually possible using the Matlab function contour3m, but  you need the Mapping Toolbox.

RELATED POSTS (MyCarta)

Visualization tips for geoscientists: Matlab

Visualization tips for geoscientists: Matlab, part II

Visualization tips for geoscientists: Matlab, part III

Image Processing Tips for Geoscientists – part 1

Compare lists from text files using Matlab – an application for resource exploration

RELATED CONTENT (External)

Basement structure in central and southern Alberta: insights from gravity and magnetic maps

Making seismic data come alive

Visual Crossplotting

Mapping multiple attributes to three- and four-component color models — A tutorial

Enhancing Fault Visibility Using Bump Mapped Seismic Attributes 

9 thoughts on “Visualization tips for geoscientists – Matlab

  1. Matteo,
    Great post.
    You have shown that Matlab is a little bit more refined in the image rendering than surfer. And thanks so much that you used the same data for both examples. I look forward to trying this out in the future if I have the oppotunity. Also, it’s wonderful that you posted the pleasing pastel colorbar as well. It’s certainly preferable to “jet”. Have you done any work on color rendering multiple attributes for well logs? There is some real opportunity for petrophysical innovation, IMO.

    Although I do believe that your slope-transparency rendering is more visually attractive than a opaque matrix, you are essentially using two different color parameters (RGB, and transparency) to display one element of data, correct? I mean, the slope is also expressed by the gradient in colors (as would the width of contour lines). I particularly enjoyed Steve Eddins “influence map” that you linked to above. Overlaying two (or more) disparate data types a single map space.

    • Hi Evan

      Thanks for the the extended feedback.
      I am glad you enjoyed the post.

      I think I will write a new post to answer your question on color and gradient with some further examples and to continue the topic and discussion. Besides, just yesterday I made a breakthrough and found a way to use transparency on 3D surface (with a hint from the Matlab community) and I’m excited to share that too.
      So stay tuned, it will take me a few days.

      On the topic of well log work, no I haven’t had the opportunity. Sounds exiting, I am intrigued: are there some published examples you could point me to?

      Cheers
      Matteo

  2. Pingback: Visualization tips for geoscientists: Surfer «

  3. Pingback: Visualization tips for geoscientists: Matlab, part II «

  4. Pingback: Image processing tips for geoscientists – 1 « MyCarta

  5. Pingback: Visualization tips for geoscientists: Matlab, part III « MyCarta

  6. Pingback: Visualization tips for geoscientists – series outline | MyCarta

  7. Pingback: Perceptual rainbow palette – the method | MyCarta

  8. Pingback: New Matlab isoluminant colormap for azimuth data | MyCarta

Leave a Reply to MatteoCancel reply