2012-06-20 6 views
1

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

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

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

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

+0

Можете ли вы загрузить образец изображения? – Jonas

ответ

0

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

+0

Спасибо. Попробуй это. Я загрузил тестовое изображение. Так как будет разница в значениях пикселей между фоном и изображением, граница изображения будет известна. Я попробую функцию угла с 4 углами. – Sista

0

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

Сначала вам нужно будет преобразовать исходное изображение в двоичный код с помощью im2bwhttp://www.mathworks.com/help/toolbox/images/ref/im2bw.html.

5

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

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); 

enter image description here

%# 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)); 

enter image description here

%# 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),:); 

enter image description here

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

+0

Эй, Джонас, Большое спасибо. Я не знал, что «regionprops» работал таким образом. Наверное, я могу попробовать это. – Sista

Смежные вопросы