Вычесть фон из изображения

Я пытаюсь вычесть фон из изображения объекта, чтобы оставить только объект переднего плана. Я нашел значения RGB фона как 218 220 219, используя imshow(). Как использовать значения RGB с помощью imsubtract()?

y = [218 220 219];
z = imsubtract(img,y);

Ошибка при использовании imsubtract (строка 55) X и Y должны иметь одинаковый размер и класс, или Y должен быть скалярным двойником.

2 ответа

Вы можете использовать bsxfun, чтобы сделать это

z = bsxfun( @minus, img, permute( [218 220 219], [1 3 2] ) );

Вы должны обратить внимание на тип и диапазон данных. Если img имеет тип ***** пиксельные значения будут находиться в диапазоне 0..255, но будет сложно вычесть значения, так как вы увидите, что результаты заканчиваются на 0: *****(4) - *****(10) равно 0... Таким образом, вы можете захотеть преобразовать img в ****** используя im2****** с пиксельными значениями в диапазоне 0..1. В этом случае вам придется преобразовать "серый" вектор [2218 220 219] в диапазон 0..1, разделив его на 255. Таким образом, более полное решение

z = bsxfun( @minus, im2******(img), permute( [218 220 219]/255, [1 3 2] ) );


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

img = imread('IMG_0792.jpg');
img = *********(img);

rows = numel(img(:,1,1));
columns = numel(img(1,:,1));

for i = 1:rows
 for j = 1:columns
 if ( ( img(i,j,1) > 0.75) && ( img(i,j,2) > 0.7) && ( img(i,j,3) > 0.7) )
 img(i,j,1) = 1;
 img(i,j,2) = 1;
 img(i,j,3) = 1;
 end
 end
end

imshow(img);

licensed under cc by-sa 3.0 with attribution.