MATLAB: Imagesc() Y Axis Log Scale Not Working (Help!)

image processingimage; log scale; imagesc

I have a matrix (image_spectrogram) which representing a image.
Using the imagesc function, I can shown the image.
eg: imagesc(x,y,log10(image_spectrogram+1));
I am trying to set the y axis to log scale, so I typed:
set(gca,'YScale','log','YDir','normal','YTick',[0.1,100,500,1000,5000]);
However, it turns out that this is a fake log scale.
The YScale did turn into log scale, but the image is absolutely identical to the linear one.
Two images are attached as following.
How to get a real log scale (y axis) image, please help me! This is the linear image:
This is the Y axis log scale image:
They are same except the fake log scale Y axis.
My original code is :
imagesc(x,y,log10(image_spectrogram(1:floor(Fs/2),:)+1));
cmap = colormap('gray');
colormap(flipud(cmap));
caxis(log10([0.9,max(image_spectrogram(:))*0.2]));
set(gca,'YScale','log','YDir','normal','YTick',[0.1,100,500,1000,5000]);
Help!

Best Answer

The way images work is that they only have coordinates for the corners. These get transformed and then the graphics hardware fills in the interior of the image using the texturemapping hardware. The texture lookup is linear (actually the ratio of two linear interpolations, but that doesn't matter here), so making one of the scales log has no effect on the interior of the image.
To get the interior of the image to transform non-linearly, you need coordinates for the interior vertices, rather than just colors. The pcolor command is the simplest way to do this:
h = pcolor(x,y,log10(image_spectrogram(1:floor(Fs/2),:)+1));
h.EdgeColor = 'none';
What pcolor is doing is actually creating a surface object and setting the view so that you're looking down from the top. It is important to note that the surface object is going to consume more memory than the image object would. That's because it actually has coordinates for all of the interior vertices.