Автоматическая обрезка MATLAB
Я пытаюсь автоматически обрезать изображение ниже в ограничивающую рамку. Фон всегда будет одного цвета. Я пробовал ответы в Найти края изображения и обрезать его в MATLAB и различные приложения и примеры на файлообменнике Mathworks, но я застрял на получении правильного boundingbox.
Я думал преобразовать изображение в черно-белое, преобразовать его в двоичное и удалить все, что ближе к белому, чем к черному, но я не уверен, как это сделать. идти о нем.
3 ответа:
Следуя ответуShai , я представляю способ обойти regionprops (Image processing toolbox), просто основанный на
find
на черно-белом изображении.% load img = im2double(imread('http://i.stack.imgur.com/ZuiEt.jpg')); % black-white image by threshold on check how far each pixel from "white" bw = sum((1-img).^2, 3) > .5; % show bw image figure; imshow(bw); title('bw image'); % get bounding box (first row, first column, number rows, number columns) [row, col] = find(bw); bounding_box = [min(row), min(col), max(row) - min(row) + 1, max(col) - min(col) + 1]; % display with rectangle rect = bounding_box([2,1,4,3]); % rectangle wants x,y,w,h we have rows, columns, ... need to convert figure; imshow(img); hold on; rectangle('Position', rect);
Вот хороший способ
img = im2double(imread('http://i.stack.imgur.com/ZuiEt.jpg')); % read image and convert it to double in range [0..1] b = sum( (1-img).^2, 3 ); % check how far each pixel from "white" % display figure; imshow( b > .5 ); title('non background pixels'); % use regionprops to get the bounding box st = regionprops( double( b > .5 ), 'BoundingBox' ); % convert to double to avoid bwlabel of logical input rect = st.BoundingBox; % get the bounding box % display figure; imshow( img ); hold on; rectangle('Position', rect );
После запроса Джака , вот вторая строка, объясненная
После преобразования
img
В Типdouble
(используяim2double
), изображение сохраняется в памяти в виде матрицыh
-by-w
-by-3 типаdouble
. Каждый пиксель имеет 3 значения между 0 и 1 (не 255!), представляя его значения RGB 0, будучи темным и 1, будучи ярким.
Таким образом(1-img).^2
проверяет, для каждого пикселя и каждого канала (RGB), насколько он далек от 1 - яркого. То чем темнее пиксель-тем больше это расстояние.
Затем мы суммируем расстояние на канал до одного значения на пиксель с помощью командыsum( . ,3 )
, оставляя намh
-by-w
2D матрицу расстояний каждого пикселя от белого.
Наконец, предполагая, что фон ярко-белый, мы выбираем все пиксели, которые значительно далеки от birghtb > .5
. Этот порог не идеален, но он хорошо фиксирует границу объекта.