Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Why my mathlab will hang?

  1. May 1, 2012 #1
    I use looping to implement this formula
    https://www.physicsforums.com/attachment.php?
    attachmentid=46840&stc=1&d=1335864568
    But,when I run, mathlab will hang?Why?
    Code (Text):
    %Import picture into Matlab
    img=imread('picture.jpg','jpg');
    img512=imresize(img, [512 512]);
    imgGRAY=uint8(rgb2gray(img512));
    figure(1);imshow(img);
    figure(2);imshow(imgGRAY);

    M=512;
    N=512;
    f=double(imgGRAY);
    F=zeros(512);
    for u=1:512
        for v=1:512
            TotalN=0;
            for x=1:512
                for y=1:512
                    TotalN=TotalN+(f(x,y)*exp(-1i*2*pi*(((u*x)/512)+((v*y)/512))));
                end
            end
            F(u,v)=(1/(M*N))*TotalN;
        end
    end
     

    Attached Files:

    Last edited: May 1, 2012
  2. jcsd
  3. May 1, 2012 #2

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    That innermost statement, TotalN=TotalN+(f(x,y)*exp(-1i*2*pi*(((u*x)/512)+((v*y)/512)))); is being performed 5124 or 68,719,476,736 times! Even if you coded this in Fortran or C it would take a long time. Matlab is a couple of orders of magnitude slower than either of those languages. If I did this calculation in python on my computer it would take over a day to complete. Matlab is perhaps a bit faster than python, but not much.

    Try seeing how long your convolution takes with a 64x64 image. Multiply by 4096. That's how long your convolution will take with a 512x512 image.
     
  4. May 1, 2012 #3
    Then is there any solution?
     
  5. May 1, 2012 #4

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    Either wait a long time or do something else. What motivated this particular kernel?
     
  6. May 1, 2012 #5
    I don't understand, what you mean for?
     
  7. May 1, 2012 #6

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    Why are you using this kernel?
     
  8. May 1, 2012 #7
    School Assignment:image processing
     
  9. May 1, 2012 #8

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    Tell us the assignment. Perhaps you misread it. If not, you might be stuck waiting for a day or so to see the results.

    Have you learned about FFTs?
     
  10. May 1, 2012 #9
    Ya,I learned fft before.
    This is the assignment question:
    1. Take a photo with your own camera and import it into Matlab converting it to a 8-bit512x512
    pixel gray scale imageI(x,y).
    2. Display the original and the gray-scale image.
    3. Write your own function to implement the Discrete Fourier Transform (DFT) in Matlab (do NOT use the Matlab function for FFT) of I:
    4. Write the Matlab code to implement the functionf(x,y) for the inverse DFT of a 2D array of complex numberF(u,v):
    5. Visualise the DFT of your grayscale imageIusingimshow().
    (Hint: You may need to scale using log to display the information within the range of the image pixel values, and center so that the origin is shifted to the centre of a 512x512.)
    6. Construct a 512x512 template for alow pass lter using a Cosine curve, where thehigh frequency components are zeroed. Apply this lter to the DFT of your image. Take the inverse DFT and visualise the Real, Imaginary and Phase. Compare with your original image. Describe each of the 5 visualised outputs (Original image, Filtered image, DFT Real, DFT Imaginary and DFT Phase).
    7. Construct a 512x512 template for ahigh pass lterusing a Sine curve where thelow frequency components are zeroed. Apply this lter to the DFT of your image. Take the inverse DFT and visualise the Real, Imaginary and Phase. Describe each of the 5 visualised outputs (Original image, Filtered image, DFT Real, DFT Imaginary and DFT Phase).
     
  11. May 2, 2012 #10

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    The chief culprit here is that you are computing the complex exponential 5124 = 68,719,476,736 times. The complex exponential obeys the identity [itex]\exp(u+v) = \exp(u)\cdot \exp(v)[/itex]. Couple this identity with the fact that your image is square and you can reduce the number of calls to the complex exponential to 5122 = 262,144.
     
  12. May 2, 2012 #11

    jhae2.718

    User Avatar
    Gold Member

    Also, MATLAB is horrible with loops. If you can vectorize your problem it will compute much faster.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook