Найдите края изображения и обрежьте его в MATLAB

У меня есть изображение RGB. Я отсканировал изображение. Таким образом, изображение занимает небольшую часть листа формата А4.

Я хочу найти границу изображения и обрезать его. Я мог бы использовать операторы обнаружения краев, такие как «Sobel». и т.д., но они обнаруживают все края, присутствующие на изображении. Все, что я хочу, это границы изображения. Также многие из функций обнаружения краев, включая «границы» работать только с двоичными или полутоновыми изображениями. Мое изображение RGB.

Я пытался использовать «imcrop», но это больше интерактивная обрезка. Я заинтересован в том, чтобы сделать это автоматически.

Загрузка тестового изображения:

 Jonas20 июн. 2012 г., 16:40
Можете ли вы загрузить образец изображения?

Ответы на вопрос(3)

bwlabel http: //www.mathworks.com/help/toolbox/images/ref/bwlabel.htm (вместе с командой find, как отмечено на странице справки), чтобы получить индексы изображения и использовать их для обрезки оригинала.

Сначала нужно преобразовать исходное изображение в двоичное, используяim2bw http: //www.mathworks.com/help/toolbox/images/ref/im2bw.htm.

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

img = imread('http://i.stack.imgur.com/dEawA.jpg');
%# instead of "==" you can check for similarity within a tolerance
tt=img(:,:,1)==img(:,:,2) & img(:,:,2) == img(:,:,3);

%# invert tt so that it's 1 where there is signal
tt = ~tt;

%# clean up some of the smaller artifacts
tto = imopen(~tt,strel('square',100));

%# get the areas and bounding box of the areas above threshold
%# as an additional criterion, you could also use excentricity
%# or you could simply remove the bottom 100 rows of the scan
stats = regionprops(tto,'BoundingBox','Area');
area = cat(1,stats.Area);
[~,maxAreaIdx] = max(Area);
bb = round(stats(maxAreaIdx).BoundingBox);

%# note that regionprops switches x and y (it's a long story)
croppedImage = img(bb(2):bb(2)+bb(4),bb(1):bb(1)+bb(3),:);

Из-за вращения осталось немного границы. Вы можете использовать маскуtto выше, чтобы установить все пиксели не изображения для NaN перед кадрированием, или вы можете использоватьimrotate чтобы исправить свое изображение.

 Sista20 июн. 2012 г., 18:42
Эй, Джонас, спасибо большое. Я не знал, что «regionprops» работает таким образом. Я думаю, я могу попробовать это.

например. Харрис-Детектор corner в Matlab). Установите максимальное количество углов для обнаружения равным 4. Затем используйте положения углов вimcrop. Если бы вы разместили изображение, я мог бы дать вам более конкретные советы. Ваше изображение RGB не должно быть проблемой, просто преобразуйте его в оттенки серого.

 Sista20 июн. 2012 г., 16:52
Благодарность. Попробую это. Я загрузил тестовое изображение. Поскольку будут существовать различия в значениях пикселей между фоном и изображением, граница изображения будет известна. Я попробую функцию угла с 4 углами.

Ваш ответ на вопрос