how to remove areas of an image containing a single color?

I have a video that I saved each frame from. The entire video has static text in big white font and it doesnt move so each frame looks very similar. Each frame also has a black background like I want to remove. Is there a way for me to remove any pixle that is (0,0,0) or (1, 1, 1) RGB? Thanks!
heres an example image that I want to crop. I want to crop all of the black and all of the white.

3 Commenti

What do you mean by remove?
It sounds like you might be interested in background subtraction. If so, check out imsubtract
For videos, you may find this answers helpful: How to use image background subtraction in video
It is not possible to create a matrix that has "holes" in it. You could detect 0,0,0 and 1,1,1 and have a logical mask that is true everywhere there is background -- but you cannot delete the background leaving only foreground. You can fill the background with something.
Thanks for this!
In the imsubtract examples this use this line of code that im not fimilar with:
strel('disk',15)
I looked up strel but I still dont really get it. The example says it uses that line of code to estimate the background, how does that work? How do I define the background as being black or anything other than the sonar image? Thanks again!

Accedi per commentare.

 Risposta accettata

Try this:
% Demo by Image Analyst
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 16;
markerSize = 20;
%--------------------------------------------------------------------------------------------------------
% READ IN TEST IMAGE
folder = [];
baseFileName = 'bradley.png';
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% The file doesn't exist -- didn't find it there in that folder.
% Check the entire search path (other folders) for the file by stripping off the folder.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
rgbImage = imread(fullFileName);
%--------------------------------------------------------------------------------------------------------
% Display the image.
subplot(2, 2, 1);
imshow(rgbImage, []);
impixelinfo;
axis('on', 'image');
title('Original RGB Image', 'FontSize', fontSize, 'Interpreter', 'None');
% Update the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(rgbImage)
% Maximize window.
g = gcf;
g.WindowState = 'maximized';
g.Name = 'Demo by Image Analyst';
g.NumberTitle = 'off';
drawnow;
%--------------------------------------------------------------------------------------------
% SPLIT INTO INDIVIDUAL COLOR CHANNELS SO WE CAN FIND WHITE.
[redImage, greenImage, blueImage] = imsplit(rgbImage);
threshold = 200; % Adjust as necessary.
whitePixels = (redImage >= threshold) & (greenImage >= threshold) & (blueImage >= threshold);
subplot(2, 2, 2);
imshow(whitePixels)
impixelinfo;
axis('on', 'image');
title('White Pixels', 'FontSize', fontSize, 'Interpreter', 'None');
drawnow;
%--------------------------------------------------------------------------------------------
% GET THE SECTOR SHAPED MASK.
% Fill holes.
mask = imfill(whitePixels, 'holes');
% Take largest blob only.
mask = bwareafilt(mask, 1);
% Erode away one pixel layer to get rid of the white outline.
mask = imerode(mask, ones(3));
% Erase outside the mask by setting those pixels to zero.
redImage(~mask) = 0;
greenImage(~mask) = 0;
blueImage(~mask) = 0;
% Reconstruct the RGB image.
rgbImage2 = cat(3, redImage, greenImage, blueImage);
% Display the image
subplot(2, 2, 3);
imshow(mask)
impixelinfo;
axis('on', 'image');
title('Mask Image', 'FontSize', fontSize, 'Interpreter', 'None');
drawnow;
%--------------------------------------------------------------------------------------------
% Find bounding box
props = regionprops(mask, 'BoundingBox')
bb = props.BoundingBox;
% Crop original image
rgbImage2 = imcrop(rgbImage2, bb);
subplot(2, 2, 4);
imshow(rgbImage2)
impixelinfo;
axis('on', 'image');
title('Cropped RGBImage', 'FontSize', fontSize, 'Interpreter', 'None');
drawnow;

4 Commenti

This is super helpful! I was able to clean it up quite a bit to keep what I wanted. Thank you very much!
in these lines where you set the pixels outside the mask to 0, is there anyway to make them transparent? I intend on importing this in GIS and only want the sonar visible, not the black box around it. Thanks again.
% Erase outside the mask by setting those pixels to zero.
redImage(~mask) = 0;
greenImage(~mask) = 0;
blueImage(~mask) = 0;
AlphaImage = double(~mask);
imwrite(rgbImage2, 'FileNameGoesHere.png', 'Alpha', AlphaImage)
There are a limited number of image formats that support transparency -- mostly PNG and TIFF.
I tried adding this to my code, but got errors. Specifically about the size of the image and how alpha is invalid. Heres the error I got:
Error using writepng>parseInputs
The value of 'alpha' is invalid. Expected input to be of size 514x928, but it is of size 536x1030.
Error in writepng (line 20)
[results, unmatched] = parseInputs(data,map,filename,varargin{:});
Error in imwrite (line 566)
feval(fmt_s.write, data, map, filename, paramPairs{:});
Error in untitled2 (line 27)
imwrite(rgbImage2, 'figure1.png', 'Alpha', AlphaImage)
Im not exactly sure what this means or how to fix it. This is my first time working with images.
I tried adding this line but it didnt work?
K = imresize(rgbImage2, [514 928]);
Thanks again.
That's because only the RGB image was cropped. The mask is still for the original image. If you want to crop that too you need to call imcrop on it
mask2 = imcrop(mask, bb); % Crop mask.
AlphaImage = double(~mask2);
imwrite(rgbImage2, 'FileNameGoesHere.png', 'Alpha', AlphaImage)

Accedi per commentare.

Più risposte (0)

Prodotti

Release

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by