-1

В настоящее время я изучаю компьютерное зрение, и я хотел бы извлечь лук из изображения. Какой был бы лучший подход для этого?Извлечение функции из изображения - предложения для лучшего подхода?

Я попытался установить пороговое значение для определения белого цвета, разбив изображение на его каналы R, G, B, но также обнаруживает отражения света на других частях изображения. Как я мог очистить это изображение, чтобы получить маску, которая приблизительно соответствует луку?

onionRGB = imread('onion.png'); 
onionGRAY = rgb2gray(onionRGB); 

figure, imshow(onionRGB); 

% split channels 
rOnion = onionRGB(:, :, 1);    % red channel 
gOnion = onionRGB(:, :, 2);    % green channel 
bOnion = onionRGB(:, :, 3);    % blue channel 


whiteThresh = 160*3; 
% detect white onion 
onionDetection = double(rOnion) + double(gOnion) + double(bOnion); 

% apply thresholding to segment the foreground 
maskOnion = onionDetection > whiteThresh; 
figure, imshow(maskOnion); 

enter image description here

enter image description here

ответ

1

Следующий код, помещенный после разделения на каналы, работает хорошо.

onionHSV = rgb2hsv(onionRGB); 
saturationOnion = onionHSV(:,:,2); 
figure; 
imagesc(saturationOnion); 
title('Saturation'); 

figure; 
imagesc(rOnion+bOnion); title('purple'); 

%apply threshold to saturation and purple brightness levels 
maskOnion = and((saturationOnion < 0.645), (rOnion+bOnion >=155)); 
%filter out all but the largest object 
maskOnion = bwareafilt(maskOnion,1); 
figure, imshow(maskOnion); 

Первый прием заключается в использовании насыщения из представления HSV цветов для целей фильтрации. Второй трюк - это ограничение по нескольким каналам. Третий трюк отфильтровывает все, кроме самого большого объекта.

the onion mask