Fego Etese asked . 2022-01-07

Adaptive background Subtraction Algorithm

Hi every one
 
I have a problem while applying threshold into the Adaptive background Algorithm My code is
 
threshold=25
for f=1:frames              
   I=read(obj,f);   
   figure(1);imshow(I);title('Input Video Sequence');     
   if f==1    
     Background=I;    
     Fg=abs(I-Background);
   else
     Fg=abs(I-Background); 
   end
end
for i=1:width
  for j=1:height
    if Fg(i,j)>threshold
      Fg(i,j)=255;
    else
      Fg(i,j)=0;
    end  
  end
end
figure(2);imshow(Fg);

This is a video file in which I am applying this algorithm but when I apply the threshold conditions the results does not effect and I cannot get the foreground mask.

 

adaptive backgrond... , image processing , digital image processing , Image Analyst

Expert Answer

Prashant Kumar answered . 2024-04-14 07:16:06

After you get through the first loop over frames, FG will have the value of the last iteration because you keep overwriting it on each iteration and never do anything with it. So after that loop ends, FG is just the last frame minus the first frame. Clearly not what you want to do. Then you're thresholding FG, which is just the last difference like I said, and displaying it.
 
 
Put the background modification and the thresholding inside your loop over frames, and display inside that loop, or else assign a frame FG{f} to store all your difference frames. I added just a few lines to my demo (which I've posted before) to handle your adaptive background stuff. Copy, paste, and run this code:
 
 
 
% Demo macro to extract frames and get frame means from an avi movie
% and save individual frames to separate image files.
% Also computes the mean gray value of the color channels.
clc;    % Clear the command window.
close all;  % Close all figures (except those of imtool.)
imtool close all;  % Close all imtool figures.
clear;  % Erase all existing variables.
workspace;  % Make sure the workspace panel is showing.
fontSize = 14;
% Change the current folder to the folder of this m-file.
% (The line of code below is from Brett Shoelson of The Mathworks.)
if(~isdeployed)
  cd(fileparts(which(mfilename)));
end
% Open the rhino.avi demo movie that ships with MATLAB.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
movieFullFileName = fullfile(folder, 'rhinos.avi');
% Check to see that it exists.
if ~exist(movieFullFileName, 'file')
  strErrorMessage = sprintf('File not found:\n%s\nYou can choose a new one, or cancel', movieFullFileName);
  response = questdlg(strErrorMessage, 'File not found', 'OK - choose a new movie.', 'Cancel', 'OK - choose a new movie.');
  if strcmpi(response, 'OK - choose a new movie.')
    [baseFileName, folderName, FilterIndex] = uigetfile('*.avi');
    if ~isequal(baseFileName, 0)
      movieFullFileName = fullfile(folderName, baseFileName);
    else
      return;
    end
  else
    return;
  end
end
try
  videoObject = VideoReader(movieFullFileName)
  % Determine how many frames there are.
  numberOfFrames = videoObject.NumberOfFrames;
  vidHeight = videoObject.Height;
  vidWidth = videoObject.Width;
  numberOfFramesWritten = 0;
  % Prepare a figure to show the images in the upper half of the screen.
  figure;
%   screenSize = get(0, 'ScreenSize');
  % Enlarge figure to full screen.
  set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
  
    % Ask user if they want to write the individual frames out to disk.
    promptMessage = sprintf('Do you want to save the individual frames out to individual disk files?');
    button = questdlg(promptMessage, 'Save individual frames?', 'Yes', 'No', 'Yes');
    if strcmp(button, 'Yes')
        writeToDisk = true;
          % Extract out the various parts of the filename.
          [folder, baseFileName, extentions] = fileparts(movieFullFileName);
          % Make up a special new output subfolder for all the separate
          % movie frames that we're going to extract and save to disk.
          % (Don't worry - windows can handle forward slashes in the folder name.)
          folder = pwd;   % Make it a subfolder of the folder where this m-file lives.
          outputFolder = sprintf('%s/Movie Frames from %s', folder, baseFileName);
          % Create the folder if it doesn't exist already.
          if ~exist(outputFolder, 'dir')
              mkdir(outputFolder);
          end
      else
          writeToDisk = false;        
      end
      % Loop through the movie, writing all frames out.
    % Each frame will be in a separate file with unique name.
    meanGrayLevels = zeros(numberOfFrames, 1);
    meanRedLevels = zeros(numberOfFrames, 1);
    meanGreenLevels = zeros(numberOfFrames, 1);
    meanBlueLevels = zeros(numberOfFrames, 1);
      for frame = 1 : numberOfFrames
      % Extract the frame from the movie structure.
      thisFrame = read(videoObject, frame);
      
          % Display it
          hImage = subplot(2, 2, 1);
          image(thisFrame);
          caption = sprintf('Frame %4d of %d.', frame, numberOfFrames);
          title(caption, 'FontSize', fontSize);
          drawnow; % Force it to refresh the window.    
    % Write the image array to the output file, if requested.
        if writeToDisk
             % Construct an output image file name.
            outputBaseFileName = sprintf('Frame %4.4d.png', frame);
            outputFullFileName = fullfile(outputFolder, outputBaseFileName);
              % Stamp the name and frame number onto the image.
              % At this point it's just going into the overlay, 
              % not actually getting written into the pixel values.
              text(5, 15, outputBaseFileName, 'FontSize', 20);
              % Extract the image with the text "burned into" it.
              frameWithText = getframe(gca);
              % frameWithText.cdata is the image with the text
              % actually written into the pixel values.
              % Write it out to disk.
              imwrite(frameWithText.cdata, outputFullFileName, 'png');
          end
    % Calculate the mean gray level.
    grayImage = rgb2gray(thisFrame);
    meanGrayLevels(frame) = mean(grayImage(:));
    % Calculate the mean R, G, and B levels.
    meanRedLevels(frame) = mean(mean(thisFrame(:, :, 1)));
    meanGreenLevels(frame) = mean(mean(thisFrame(:, :, 2)));
    meanBlueLevels(frame) = mean(mean(thisFrame(:, :, 3)));
    % Plot the mean gray levels.
    hPlot = subplot(2, 2, 2);
        hold off;
    plot(meanGrayLevels, 'k-', 'LineWidth', 2);
        hold on;
        plot(meanRedLevels, 'r-');
        plot(meanGreenLevels, 'g-');
        plot(meanBlueLevels, 'b-');
        grid on;
    
        % Put title back because plot() erases the existing title.
    title('Mean Gray Levels', 'FontSize', fontSize);
        if frame == 1
      xlabel('Frame Number');
      ylabel('Gray Level');
            % Get size data later for preallocation if we read
            % the movie back in from disk.
            [rows columns numberOfColorChannels] = size(thisFrame);
        end
          % Update user with the progress.  Display in the command window.
          if writeToDisk
          progressIndication = sprintf('Wrote frame %4d of %d.', frame, numberOfFrames);
          else
          progressIndication = sprintf('Processed frame %4d of %d.', frame, numberOfFrames);
          end
      disp(progressIndication);
      % Increment frame count (should eventually = numberOfFrames
      % unless an error happens).
      numberOfFramesWritten = numberOfFramesWritten + 1;
      
      % Now let's do the differencing
      alpha = 0.5;
      if frame == 1
        Background = thisFrame;
      else
        % Change background slightly at each frame
  %       Background(t+1)=(1-alpha)*I+alpha*Background
        Background = (1-alpha)* thisFrame + alpha * Background;
      end
      % Display the changing/adapting background.
      subplot(2, 2, 3);
      imshow(Background);
      title('Adaptive Background', 'FontSize', fontSize);
      % Calculate a difference between this frame and the background.
      differenceImage = thisFrame - uint8(Background);
      % Threshold with Otsu method.
      grayImage = rgb2gray(differenceImage); % Convert to gray level
      thresholdLevel = graythresh(grayImage); % Get threshold.
      binaryImage = im2bw( grayImage, thresholdLevel); % Do the binarization
      % Plot the binary image.
      subplot(2, 2, 4);
      imshow(binaryImage);
      title('Binarized Difference Image', 'FontSize', fontSize);
      end
      % Alert user that we're done.
      if writeToDisk
          finishedMessage = sprintf('Done!  It wrote %d frames to folder\n"%s"', numberOfFramesWritten, outputFolder);
      else
          finishedMessage = sprintf('Done!  It processed %d frames of\n"%s"', numberOfFramesWritten, movieFullFileName);
      end
      disp(finishedMessage); % Write to command window.
      uiwait(msgbox(finishedMessage)); % Also pop up a message box.
      % Exit if they didn't write any individual frames out to disk.
      if ~writeToDisk
          return;
      end
      % Ask user if they want to read the individual frames from the disk,
      % that they just wrote out, back into a movie and display it.
      promptMessage = sprintf('Do you want to recall the individual frames\nback from disk into a movie?\n(This will take several seconds.)');
      button = questdlg(promptMessage, 'Recall Movie?', 'Yes', 'No', 'Yes');
      if strcmp(button, 'No')
          return;
      end
      % Read the frames back in, and convert them to a movie.
      % I don't know of any way to preallocate recalledMovie.
      for frame = 1 : numberOfFrames
          % Construct an output image file name.
          outputBaseFileName = sprintf('Frame %4.4d.png', frame);
          outputFullFileName = fullfile(outputFolder, outputBaseFileName);
          % Read the image in from disk.
          thisFrame = imread(outputFullFileName);
          % Convert the image into a "movie frame" structure.
          recalledMovie(frame) = im2frame(thisFrame);
      end
      % Get rid of old image and plot.
      delete(hImage);
      delete(hPlot);
      % Create new axes for our movie.
      subPlot(1, 3, 2);
      axis off;  % Turn off axes numbers.
      title('Movie recalled from disk', 'FontSize', fontSize);
      % Play the movie in the axes.
      movie(recalledMovie);
      % Note: if you want to display graphics or text in the overlay
      % as the movie plays back then you need to do it like I did at first
      % (at the top of this file where you extract and imshow a frame at a time.)
      msgbox('Done with this demo!');
catch ME
  % Some error happened if you get here.
  stError = lasterror;
  strErrorMessage = sprintf('Error extracting movie frames from:\n\n%s\n\nError: %s\n\n)', movieFullFileName, stError.message);
  uiwait(msgbox(strErrorMessage));
end

 


Not satisfied with the answer ?? ASK NOW

Frequently Asked Questions

MATLAB offers tools for real-time AI applications, including Simulink for modeling and simulation. It can be used for developing algorithms and control systems for autonomous vehicles, robots, and other real-time AI systems.

MATLAB Online™ provides access to MATLAB® from your web browser. With MATLAB Online, your files are stored on MATLAB Drive™ and are available wherever you go. MATLAB Drive Connector synchronizes your files between your computers and MATLAB Online, providing offline access and eliminating the need to manually upload or download files. You can also run your files from the convenience of your smartphone or tablet by connecting to MathWorks® Cloud through the MATLAB Mobile™ app.

Yes, MATLAB provides tools and frameworks for deep learning, including the Deep Learning Toolbox. You can use MATLAB for tasks like building and training neural networks, image classification, and natural language processing.

MATLAB and Python are both popular choices for AI development. MATLAB is known for its ease of use in mathematical computations and its extensive toolbox for AI and machine learning. Python, on the other hand, has a vast ecosystem of libraries like TensorFlow and PyTorch. The choice depends on your preferences and project requirements.

You can find support, discussion forums, and a community of MATLAB users on the MATLAB website, Matlansolutions forums, and other AI-related online communities. Remember that MATLAB's capabilities in AI and machine learning continue to evolve, so staying updated with the latest features and resources is essential for effective AI development using MATLAB.

Without any hesitation the answer to this question is NO. The service we offer is 100% legal, legitimate and won't make you a cheater. Read and discover exactly what an essay writing service is and how when used correctly, is a valuable teaching aid and no more akin to cheating than a tutor's 'model essay' or the many published essay guides available from your local book shop. You should use the work as a reference and should not hand over the exact copy of it.

Matlabsolutions.com provides guaranteed satisfaction with a commitment to complete the work within time. Combined with our meticulous work ethics and extensive domain experience, We are the ideal partner for all your homework/assignment needs. We pledge to provide 24*7 support to dissolve all your academic doubts. We are composed of 300+ esteemed Matlab and other experts who have been empanelled after extensive research and quality check.

Matlabsolutions.com provides undivided attention to each Matlab assignment order with a methodical approach to solution. Our network span is not restricted to US, UK and Australia rather extends to countries like Singapore, Canada and UAE. Our Matlab assignment help services include Image Processing Assignments, Electrical Engineering Assignments, Matlab homework help, Matlab Research Paper help, Matlab Simulink help. Get your work done at the best price in industry.