Thursday, August 25, 2016

How to learn to code?

Coding (perhaps like most things) is all about perspective.

My academic appointment is the Department of Physiology in the Medical School at the University of Kentucky. Only a few people in the department know how to program and, as a result, most of my colleagues think I'm 'pretty good with computers'.

My collaborators in Engineering and Chemistry across the street are always polite but think I code like a Geico Caveman.

Why do so few physiologists code? I used to think it's because biomedical scientists didn't think it was useful but I've changed my mind. I now think that our students don't code because they've never been taught. They've typically taken lots of courses in biology, chemistry, and genetics, but nobody has shown them how to write code, or how to break a task down into little steps so that they can create an algorithm.

What's the best way of helping these students get started?

I've blogged about how I  learned to program before but my advice won't work for everybody and I'm always looking for new resources that I can tell students about.

Today, I came across the MATLAB OnRamp. This resource has actually been around for several years but I hadn't seen it before and it looks interesting. If you have any experience with it, or can suggest better ways of getting started in scientific computing, please share your thoughts in the comments below. 

Monday, August 22, 2016

Filtering binary images by object size in MATLAB

As usual, I learned something new when I read Steve Eddin's latest blog post.

This time around, I discovered that MATLAB has some new features that make it easy to filter binary objects based on their size. There were, of course, old ways to do this but the new bwareafilt command (at least, new in MATLAB 2014B) simplifies some workflows.

Sunday, August 21, 2016

POV-Ray animation

This post continues my introduction to generating images and movies using POV-Ray.

In the last post, I showed how to render a simple scene. Now I am going to show how to animate it.

POV-Ray includes a lot of options for animation and this page provides some great tutorials and examples. However, I have always found it easier to generate animations by automatically generating different *.pov files and then rendering them as part of my workflow.

The last part is easy because you can call POV-Ray directly from the command line. (See here for many options.)

For example, once you are in the directory that contains the main POV-Ray executable, you can produce a PNG file that is 340 by 280 pixels from the scene described in c:\temp\out.pov using this command.

pvengine +W340 +H280 c:\temp\out.pov /exit

Here's some MATLAB code that will spin the camera around the previous image.

function povray_animation

r = -25;
no_of_points = 50;
x = r*cosd(linspace(0,360,no_of_points))

for i=1:no_of_points
    pov_file = fopen(fullfile(cd,sprintf('out%.0f.pov',i)),'w');
    fprintf(pov_file,'#include ""\n');
    fprintf(pov_file,'background {color White}\n');
    fprintf(pov_file,'camera {location <%f,25,25>\n',x(i));
    fprintf(pov_file,'\tsky <0,0,1>\n');
    fprintf(pov_file,'\tlook_at <10,0,0>}\n');
    fprintf(pov_file,'light_source {<%f,25,25> color White}\n',x(i));
    fprintf(pov_file, ...
        'cylinder {<0,0,0>,<10,0,0>,1 texture {pigment {color Red}}}\n');
    fprintf(pov_file, ...
        'cylinder {<0,0,0>,<0,10,0>,1 texture {pigment {color Green}}}\n');
    fprintf(pov_file, ...
        'cylinder {<0,0,0>,<0,0,10>,1 texture {pigment {color Blue}}}\n');
    fprintf(pov_file, ...
        'sphere {<10,10,10>,3 texture {pigment {color OrangeRed}}}\n');
    cd_string = 'cd c:\program files\pov-ray\v3.7\bin';
    command_string = sprintf('%s\npvengine +W340 +H280 %s +A /exit', ...
        cd_string, ...
    batch_file = fopen('pov.bat','w');

It's now easy to stitch the *.png files together to make a movie.

Saturday, August 13, 2016

POV-Ray basics

POV-Ray is a ray-tracing program. My simplistic view of what this means is that POV-Ray can turn a description of a scene into an image.

Here's an example.

1) Install POV-Ray (downloads here)

2) Start POV-Ray, and create a new file

3) Copy and paste the following text into the new file.

#include ""

background {color White}
camera {location <-25,25,25>
sky <0,0,1>
look_at <10,0,0>}
light_source { <-25,25,25> color White }
cylinder{<0,0,0>,<10,0,0>,1 texture {pigment {color Red}}}                    
cylinder{<0,0,0>,<0,10,0>,1 texture {pigment {color Green}}}
cylinder{<0,0,0>,<0,0,10>,1 texture {pigment {color Blue}}}

sphere {<10,10,10>,3 texture {pigment {color OrangeRed}}}

4) Run

5) You should see the following image

6) Here's what the *.pov file did

  • It put a camera at x=-25, y=25, z=25.
  • The sky command aligned the camera along the z -axis. (If there was a pole sticking out the top of the camera, the pole would be parallel to the z axis.)
  • The camera is pointing at x=10, y=0, z=0.
  • There is a light at the same location as the camera.
  • Three cylinders start at the origin <0,0,0> and run along the x, y, and z axes respectively.
  • Finally, there's a sphere at x=10, y=10, z=10.

7) When you pressed Run, POV-Ray worked out what the camera would have seen and created a *.png file of the view.

That's the basics. Everything else I've done in POV-Ray is just an extension of these sorts of techniques. I'll describe a few of my tricks in upcoming posts.

If you want to see what experts can do, take a look at the POV-Ray Hall of Fame.

Wednesday, August 10, 2016

Word clouds

A quick aside - I will get back to POV-Ray soon.

I wanted to make a Word Cloud for something at work. I've never done this before so I adopted my usual strategy - look in the MATLAB FileExchange to see if somebody has already created a tool.

As is nearly always the case, I found something useful, WordData Visualization. It was even a Pick of the Week back in 2015.

Five minutes later, and I had what I wanted. Then I went on to generate a figure based on the text from my PhD thesis. It doesn't get much more exciting :-)

Sunday, August 7, 2016

POV-Ray - old but gold

I wanted to render some 3D images recently. I downloaded SketchUp and Blender and did some quick googling.

Both packages look really interesting but they look as if they are primarily GUI-based. I realize that's what most people probably want but I needed to render a scene that contains thousands of objects. I didn't want to have to add these into my scene one at a time.

I'm sure somebody will explain how to create complex scenes in SketchUp and Blender (please write a comment if you do) but I decided to go back to POV-Ray. It's old (the last release was in 2013) but it's very functional. I used MATLAB to create my scene in the POV-Ray format (*.pov) and then rendered the image using the POV-Ray engine.

I'll explain how I automated the process in the next few posts and created 'fly-through movies' with a single click but, for now, here's a quick example of the sort of image I was able to generate.

I think it's pretty cool.