# How to get the DCT energy distribution image in MATLAB,or we may call it the DCT coefficients distribution image?

The picture below is drawn by the DCT coefficients after making DCT to an image :

I want to get an image like the picture above. Here are some problems:

1. Should I do the DCT to the whole image instead of using the block DCT? And what MATLAB function should I use?
2. How to deal with the coefficients? Make it in the range of $[0, 255]$? Or make the coefficients matrix to be a Binary Image?

I would really appreciate if someone can help me!

## 1 Answer

The general shape of this image can (probably) be obtained with Matlab function DCT2 applied on the whole image (problem 1). I suspect this image comes from the absolute of the actual DCT matrix which generally has positive and negative values (problem 2). The absolute value was probably modified by a non-linear mapping, such as a logarithm or a power. The reason is you almost mostly black values on the bottom-right, probably zeroes at high frequencies. Would you have positive and negative values, this area could appear in mid-gray colors.

The PNG file has 251 colors, so the absolute DCT matrix with real values was somehow rounded to 8 bits, possibly scaled, and not binarized.

On your question: How to deal with the coefficients? you should tell us what you would like to do apart from displaying a grayscale absolute 2D DCT image. You can compute energy concentration in the DCT domain, or identify the two bright lines as two main orientations with high gradients on the original image.

The following code produces a similar image, depicted below.

parBoxCox = 0.15;
data = imread('gantrycrane.png');
dataTrans = (1+(abs(dct2(rgb2gray(data))))).^parBoxCox;
dataTrans = floor(dataTrans*255/max(dataTrans(:)));
imagesc(dataTrans);colormap gray


• To see an image like above image, you must calculate log10 of you DCT values and show them. The dynamic range of DCT coefs is too high to be fitted in small range of 0 to 255. Some code might be useful here, I=imread('Your Image.Image'); DCT=dct2(I); imshow(log10(DCT),[]); – MimSaad Aug 13 '16 at 17:35
• No, it is better to be in comments as I put, however your answer would improve I feel, if you mention dynamic range reduction through applying a logarithmic function. – MimSaad Aug 13 '16 at 18:11
• you are absolutely right. of course we do not have such thing as logarithm DCT transform, We only take logarithm of the DCT coefficients for better visualization. But the above image is surely, is image of logarithm of DCT coefficients not the DCT itself. Give it a try in Matlab and you'll see. – MimSaad Aug 13 '16 at 18:42
• @Mimsaad Good idea, done – Laurent Duval Aug 13 '16 at 20:44
• Normalization also works, well done! – MimSaad Aug 14 '16 at 8:33