Как я могу удалить тень на изображении? - PullRequest
0 голосов
/ 02 марта 2020

Я студент, изучающий программу MATLAB.

Я бы хотел удалить всю тень на изображении. На этом сайте я обнаружил код, который может обнаружить как желаемую цель, так и тень. и теперь я пытаюсь установить пороговое значение только для части семени.

Я пытался найти два способа удаления теней

  1. нахождение значения пикселя для области тени
  2. Автомат c Порог области тени (метод Оцу)

Однако я не могу найти правильный способ удаления тени.

Пожалуйста, ответьте на мой вопрос если кто-то знает.

Мой код и образец изображения прилагаются.

close all;  % Close all figures (except those of imtool.)
clc;    % Clear the command window.
workspace;  % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 16;
%===============================================================================
% Get the name of the image the user wants to use.
baseFileName = '1-5a.jpg';
folder = pwd
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

%=======================================================================================
% Read in demo image.
rgbImage = imread(fullFileName);
% Get the dimensions of the image.
[rows, columns, numberOfColorChannels] = size(rgbImage)

% Display image.
subplot(2, 2, 1);
imshow(rgbImage, []);
axis on;
caption = sprintf('Original Color Image\n%s', baseFileName);
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
hp = impixelinfo(); % Set up status line to see values when you mouse over the image.

% Set up figure properties:
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0.05 1 0.95]);
% Get rid of tool bar and pulldown menus that are along top of figure.
% set(gcf, 'Toolbar', 'none', 'Menu', 'none');
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
drawnow;

% Do color segmentation:
[BW,maskedRGBImage] = createMask(rgbImage);

% Display the image.
subplot(2, 2, 2);
imshow(BW);
title('Color Segmentation', 'FontSize', fontSize, 'Interpreter', 'None');
axis on;
drawnow;

% Clean up by filling holes and taking the largest blob.
seedMask = imfill(BW, 'holes');
seedMask = bwareafilt(seedMask, 1);

% Display the image.
subplot(2, 2, 3);
imshow(seedMask);
title('Final Seed Mask', 'FontSize', fontSize, 'Interpreter', 'None');
axis on;
drawnow;

% Mask the image using bsxfun() function to multiply the mask by each channel individually.
maskedRGBImage = bsxfun(@times, rgbImage, cast(seedMask, 'like', rgbImage));
% Display the image.
subplot(2, 2, 4);
imshow(maskedRGBImage);
title('Final Masked Image', 'FontSize', fontSize, 'Interpreter', 'None');
axis on;
drawnow;

function [BW,maskedRGBImage] = createMask(RGB)
%createMask  Threshold RGB image using auto-generated code from colorThresholder app.
%  [BW,MASKEDRGBIMAGE] = createMask(RGB) thresholds image RGB using
%  auto-generated code from the colorThresholder app. The colorspace and
%  range for each channel of the colorspace were set within the app. The
%  segmentation mask is returned in BW, and a composite of the mask and
%  original RGB images is returned in maskedRGBImage.

% Auto-generated by colorThresholder app on 02-Mar-2020
%------------------------------------------------------


% Convert RGB image to chosen color space
I = rgb2hsv(RGB);

% Define thresholds for channel 1 based on histogram settings
channel1Min = 0.000;
channel1Max = 0.993;

% Define thresholds for channel 2 based on histogram settings
channel2Min = 0.000;
channel2Max = 0.325;

% Define thresholds for channel 3 based on histogram settings
channel3Min = 0.409;
channel3Max = 0.937;

% Create mask based on chosen histogram thresholds
sliderBW = ( (I(:,:,1) >= channel1Min) | (I(:,:,1) <= channel1Max) ) & ...
    (I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...
    (I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);
BW = sliderBW;

% Invert mask
BW = ~BW;

% Initialize output masked image based on input image.
maskedRGBImage = RGB;

% Set background pixels where BW is false to zero.
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;

end

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...