Fanning Software Consulting

Images with Log-Linear Aspect Ratios

QUESTION: I wish to display an image with a logarithmic aspect ratio on one axis, and a linear aspect ratio on another axis. This is different from displaying the logarithm of the image values, because what I want is that the image pixels at the bottom on the image be stretched more than the pixels at the top.

I can think of some (tortured) ways to do this, but I keep thinking there must be some sophisticated way to handle this in IDL. Do you have any ideas?

ANSWER: I don't have any ideas, but Ben Tupper does. He suggests that the way to do this would be to use a flat, filled IDLgrSurface object that is projected in the same way one might view an image, but with a log-scaled Y axis. The image data is placed on top of this surface by means of a texture map, using the TEXTURE_MAP keyword of the surface object. He offers the following IDL code as an example.

   ; Read the data, collect size information.
   rose = Read_Image(FilePath('rose.jpg',SUBDIRECTORY=['examples','data']))
   dim = Size(rose, /DIMENSIONS)
   nx = dim[1] 
   ny = dim[2]
   x = Findgen(nx) + 1
   y = Findgen(ny) + 1
   s = Replicate(1, nx, ny)

   ; The first surface is a "regular" surface.
   surf_1 = Obj_New("IDLgrSurface", s, x, y, $
     COLOR=[255,255,255], STYLE=2, $
     TEXTURE_MAP=Obj_New("IDLgrImage", rose))
   model_1 = Obj_New("IDLgrModel")
   model_1 -> Add, surf_1 
   model_1 -> Translate, 0, -ny/2. - 10, 0

   ; Scale so they take up the same amount of space on display.
   scale = ny / alog10(ny)

   ; The second surface is log scale in y.
   surf_2 = Obj_New("IDLgrSurface", s, x, alog10(y), $
     COLOR=[255,255,255], STYLE=2, $
     TEXTURE_MAP=Obj_New("IDLgrImage", rose))
   model_2 = Obj_New("IDLgrModel")
   model_2 -> Add, surf_2 
   model_2 -> Scale, 1, scale, 1
   model_2 -> Translate, 0,ny/2. + 10, 0

   ; View the two surfaces
   XObjView, [model_1, model_2] , /BLOCK

   ; Clean up.
   Obj_Destroy, [model_1, model_2]

Running the code above results in the output shown in the figure below. The image with a linear aspect ratio is shown at the bottom of the figure, and the image with a logarithmic Y axis is shown at the top of the figure.

The result.
The image with logarithmic aspect ratio is at the top.

Version of IDL used to prepare this article: IDL 7.0.1.

Web Coyote's Guide to IDL Programming