Remove black pixels from RGB image.
古いコメントを表示
I know that variations of this question get asked a lot on here, but I haven't found a solution that works for my problem very well.

How do I remove the black border from the image above programmatically, but not by using imcrop!? I would prefer to find & remove all of the black pixels in the image, by effectively deleting that data--leaving me with a (yes) cropped image that contains only the color region of this image. My attempt is as follows:
% define scale bar:
firstFrame = read(vidObj,1);
imshow(firstFrame,'InitialMagnification',300);
title('Define the scale bar region:','FontSize',16);
scaleBar = drawrectangle('Color',[1 1 0]);
roi_Bar = scaleBar.Position;
% cropped and screwed:
I = imcrop(firstFrame, roi_Bar);
figure;
imshow(I);
% remove black border:
mask = (I(:, :, 1) == 0) & (I(:, :, 2) == 0) & (I(:, :, 3) == 0);
I(mask) = [];
figure;
imshow(I); % this returns a horrific result
Many thanks in advance!
2 件のコメント
Mario Malic
2021 年 1 月 15 日
Hi Luke,
I'll chip in my suggestions in here, while someone else with more knowledge comes by.
The border that you want to remove consists of different colors, not only of RGB [0, 0, 0], but RGB [0, 1, 0], and many other different colors. So, I guess the solution is to find all the colors that border consists of. Unfortunatelly, I can't help with this.
Luke G.
2021 年 1 月 15 日
採用された回答
その他の回答 (1 件)
Jeffrey Daniels
2023 年 1 月 31 日
0 投票
img_2d = reshape(img,[numrows*numcols],3);
% Find the indices of the rows that are remove_color
remove_color = [0,0,0];
color_idx = ~ismember(img_2d,remove_color, 'rows');
% Replace remove_color with white
img_2d(color_idx) = [255,255,255];
img = reshape(img_2d,[numrows,numcols,3]);
% Remove the rows that are remove_color (Optional, if you really want to "remove" them", but as stated it will no longer be rectanglar. This only works if you want statistics on your colors.)
img_2d_nw = img_2d(~color_idx, :);
1 件のコメント
Improvements to make a better answer:
- Format the code
- Make the example complete enough that it can be demonstrated in the editor
- Make sure the example does what you say it does
% a uint8 RGB image with black border
img = imread('peppers.png');
img = padarray(img,[10 10],0,'both');
imshow(img)
% get the size
[numrows,numcols,nchan,~] = size(img);
% reshape the image into a 3-column matrix
img_2d = reshape(img,numrows*numcols,3);
% Find the indices of the rows that are remove_color
remove_color = [0,0,0];
color_idx = ismember(img_2d,remove_color,'rows'); % select the correct region
% Either replace remove_color with a new color ...
new_color = [255 255 0]; % white would be invisible against the webpage background
img_2d(color_idx,:) = repmat(new_color,[nnz(color_idx) 1]); % make sure addressing works
img = reshape(img_2d,[numrows,numcols,3]);
imshow(img)
% ... or remove the rows that are remove_color
% (Optional, if you really want to "remove" them", but as stated it will no longer be rectanglar.
% This only works if you want statistics on your colors.)
img_2d_nw = img_2d(~color_idx, :);
カテゴリ
ヘルプ センター および File Exchange で Convert Image Type についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



