Автоматическая обрезка MATLAB


Я пытаюсь автоматически обрезать изображение ниже в ограничивающую рамку. Фон всегда будет одного цвета. Я пробовал ответы в Найти края изображения и обрезать его в MATLAB и различные приложения и примеры на файлообменнике Mathworks, но я застрял на получении правильного boundingbox.

Я думал преобразовать изображение в черно-белое, преобразовать его в двоичное и удалить все, что ближе к белому, чем к черному, но я не уверен, как это сделать. идти о нем.

Пенал

3 2

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 матрицу расстояний каждого пикселя от белого.
Наконец, предполагая, что фон ярко-белый, мы выбираем все пиксели, которые значительно далеки от birght b > .5. Этот порог не идеален, но он хорошо фиксирует границу объекта.

Обрезка изображения сначала создайте окно boundry, где вы хотите обрезать.

Crp = imcrop (original_image_name, boundry_box);

Я сделал это в своем задании. Это действительно работает!!!!!!