Decomposing an image into two frequency components using DCT?

前端 未结 2 709
闹比i
闹比i 2021-02-06 18:38

I am a beginner in digital image processing field, recently I am working on a project where I have to decompose an image into two frequency components namely (low and high) usin

相关标签:
2条回答
  • 2021-02-06 19:23

    As you've mentioned, dct2 and idct2 will do most of the job for you. The question that remains is then: What is high frequency and what is low frequency content? The coefficients after the 2 dimensional transform will actually represent two frequencies each (one in x- and one in y-direction). The following figure shows the bases for each coefficient in an 8x8 discrete cosine transform:

    Therefore, that question of low vs. high can be answered in different ways. A common way, which is also used in the JPEG encoding, proceeds diagonally from zero-frequency downto the max as shown above. As we can see in the following example that is mostly motivated because natural images are largely located in the "top left" corner of "low" frequencies. It is certainly worth looking at the result of dct2 and play around with the actual choice of your regions for high and low.

    In the following I'm dividing the spectrum diagonally and also plotting the DCT coefficients - in logarithmic scale because otherwise we would just see one big peak around (1,1). In the example I'm cutting far above half of the coefficients (adjustable with cutoff) we can see that the high-frequency part ("HF") still contains some relevant image information. If you set cutoff to 0 or below only noise of small amplitude will be left.

    Results

    %// Load an image
    Orig = double(imread('rice.png'));
    %// Transform
    Orig_T = dct2(Orig);
    %// Split between high- and low-frequency in the spectrum (*)
    cutoff = round(0.5 * 256);
    High_T = fliplr(tril(fliplr(Orig_T), cutoff));
    Low_T = Orig_T - High_T;
    %// Transform back
    High = idct2(High_T);
    Low = idct2(Low_T);
    
    %// Plot results
    figure, colormap gray
    subplot(3,2,1), imagesc(Orig), title('Original'), axis square, colorbar 
    subplot(3,2,2), imagesc(log(abs(Orig_T))), title('log(DCT(Original))'),  axis square, colorbar
    
    subplot(3,2,3), imagesc(log(abs(Low_T))), title('log(DCT(LF))'), axis square, colorbar
    subplot(3,2,4), imagesc(log(abs(High_T))), title('log(DCT(HF))'), axis square, colorbar
    
    subplot(3,2,5), imagesc(Low), title('LF'), axis square, colorbar
    subplot(3,2,6), imagesc(High), title('HF'), axis square, colorbar
    

    (*) Note on tril: The lower triangle-function operates with respect to the mathematical diagonal from top-left to bottom-right, since I want the other diagonal I'm flipping left-right before and afterwards.

    Also note that this kind of operations are not usually applied to entire images, but rather to blocks of e.g. 8x8. Have a look at blockproc and this article.

    0 讨论(0)
  • 2021-02-06 19:31

    An easy example:

    I2 = dct_img;
    I2(8:end,8:end) = 0;
    I3 = idct2(I2);
    imagesc(I3)
    

    I3 can be seen as the image after low pass filter (the low frequency components), then idct2(dct_img - I2) can be viewed as high frequency.

    0 讨论(0)
提交回复
热议问题