image processing algorithm in MATLAB

前端 未结 2 659
别那么骄傲
别那么骄傲 2020-12-10 12:14

I am trying to implement an algorithm described in this paper:

Decomposition of biospeckle images in temporary spectral bands

H

相关标签:
2条回答
  • 2020-12-10 12:31

    A couple of issue I can spot:

    • when you divide the signal by its mean, you need to check that it was not zero. Otherwise the result will be NaN.

    • the authors (I am following this article) used a bank of filters with frequency bands covering the entire range up to the Nyquist frequency. You are doing half of that. The normalized frequencies you pass to butter should go all the way up to 1 (corresponds to fs/2)

    • When computing the energy of each filtered signal, I think you should not divide by its mean (you have already accounted for that before). Instead simply do: E = sum(sig.^2); for each of the filtered signals

    • In the last post-processing step, you should normalize to the range [0,1], and then apply the median filtering algorithm medfilt2. The computation doesn't look right, it should be something like:

      img = ( img - min(img(:)) ) ./ ( max(img(:)) - min(img(:)) );
      

    EDIT:

    With the above points in mind, I tried to rewrite the code in a vectorized way. Since you didn't post sample input images, I can't test if the result is as expected... Plus I am not sure how to interpret the final images anyway :)

    %# read biospeckle images
    fnames = dir( fullfile('folder','myimages*.jpg') );
    fnames = {fnames.name};
    N = numel(fnames);                    %# number of images
    Fs = 1;                               %# sampling frequency in Hz
    sz = [209 278];                       %# image sizes
    T = zeros([sz N],'uint8');            %# store all images
    for i=1:N
        T(:,:,i) = imread( fullfile('folder',fnames{i}) );
    end
    
    %# timeseries corresponding to every pixel
    T = reshape(T, [prod(sz) N])';        %# columns are the signals
    T = double(T);                        %# work with double class
    
    %# normalize signals before filtering (avoid division by zero)
    mn = mean(T,1);
    T = bsxfun(@rdivide, T, mn+(mn==0));  %# divide by temporal mean
    
    %# bank of filters
    numBanks = 10;
    order = 5;                                       % butterworth filter order
    fCutoff = linspace(0, Fs/2, numBanks+1)';        % lower/upper cutoff freqs
    W = [fCutoff(1:end-1) fCutoff(2:end)] ./ (Fs/2); % normalized frequency bands
    W(1,1) = W(1,1) + 1e-5;                          % adjust first freq
    W(end,end) = W(end,end) - 1e-5;                  % adjust last freq
    
    %# filter signals using the bank of filters
    Tf = cell(numBanks,1);                %# filtered signals using each filter
    for i=1:numBanks
        [b,a] = butter(order, W(i,:));    %# bandpass filter
        Tf{i} = filter(b,a,T);            %# apply filter to all signals
    end
    clear T                               %# cleanup unnecessary stuff
    
    %# compute average energy in each signal across frequency bands
    Tf = cellfun(@(x)sum(x.^2,1), Tf, 'Uniform',false);
    
    %# normalize each to [0,1], and build corresponding images
    Tf = cellfun(@(x)reshape((x-min(x))./range(x),sz), Tf, 'Uniform',false);
    
    %# show images
    for i=1:numBanks
        subplot(4,3,i), imshow(Tf{i})
        title( sprintf('%g - %g Hz',W(i,:).*Fs/2) )
    end
    colormap(gray)
    

    screenshot

    (I used the image from here for the above result)

    EDIT#2

    Made some changes and simplified the above code a bit. This shall reduce memory footprint. For example I used cell array instead of a single multidimensional matrix to store the result. That way we don't allocate one big block of contiguous memory. I also reused same variables instead of introducing new ones at each intermediate step...

    0 讨论(0)
  • 2020-12-10 12:32

    The paper doesn't mention subtracting the mean of the time series, are you sure that's necessary? Also, you only compute the new_max and new_min once, from the last image.

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