2015-12-31 2 views
-1

Я пытаюсь вычислить площадь общей площади рассеянных квадратов, как изображение ниже.Площадь Площадь Плоских Квадратов

Я знаю, что есть функция, с помощью которой мы могли бы оценить размер области, сделав всеобъемлющую выпуклую, но я не уверен, могу ли я использовать какой-либо подобный метод для решения этой проблемы.

Есть ли у кого-то есть хорошая идея?

Изображение: enter image description here

Edit [01/01/2016]: Код я попытался, как это. Он работает, но каждый раз он должен сохранять и загружать изображение .png. Я хотел спросить, можно ли вычислить размер без процесса сохранения изображений.

clear 

b=zeros(127,2); %matrix 

for i=1:127 
    rnd=randn(1,2); 
    b(i,:)=30.*rnd; 
end 

BW=scatter(b(:,1),b(:,2),15,[],'r','s','filled'); 

view(2) %view from Z+ 
axis off 
saveas(gcf,'scatter.png') 

close all 

BWbase = imread('scatter.png'); %import 
BW = im2bw(BWbase,0.5); %convert to binary data 
imshow(BW); 
bwarea(BW) 
+0

Вы уже пробовали какой-либо код? SO не является сервисом кодирования, и если вы покажете нам, что вы пробовали, люди с большей вероятностью помогут вам. –

+1

Благодарим за совет. Я добавил примечание, чтобы прояснить суть. –

+0

'BW = разброс (b (:, 1), b (:, 2), 15, [], 'r', 's', 'fill');' дает ошибку. Сначала попробуйте исправить свой код. – NKN

ответ

0

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

1- Вам не нужно инициализировать b нулями, а затем заполнить его, используя цикл for по случайным значениям. Вместо этого вы можете делать все, что в одной строке кода:

b = 30 * randn(127,2); 

2- Тогда вы построить точки с помощью scatter. Я удалил [], чтобы исправить эту команду.

BW = scatter(b(:,1),b(:,2),15,'r','s','filled'); 

Обратите внимание, что это не изображение, а фигура, которую нужно преобразовать в изображение. Функция, которую вы ищете, - getframe. Эта функция записывает кадр из рисунка. Вы можете позвонить ему, предоставив ему текущую цифру gcf.

F = getframe(gcf); 

4- Теперь ваш кадр в хранится в F, но это не образ еще. Чтобы преобразовать его в изображение, вам нужно использовать функцию frame2im.

[X, Map] = frame2im(F); 

5- Тогда, как вы делали это сами, вы преобразовать изображение в двоичную и рассчитать площадь:

BW2 = im2bw(X,0.5); 
bwarea(BW2) 

Весь код можно увидеть здесь:

b = 30 * randn(127,2); 
BW = scatter(b(:,1),b(:,2),15,'r','s','filled'); 
axis off 
F = getframe(gcf); 
[X, Map] = frame2im(F); 
BW2 = im2bw(X,0.5); 
imshow(BW2); 
bwarea(BW2) 

enter image description here

Для получения дополнительной информации ознакомьтесь со следующими документами: getframe, frame2im.

+0

Спасибо за ваш ответ. Фактически, код, который вы показали, недоступен в моей среде (Octave 3.x). В конце концов я справился с задачей, сохраняя и перезагружая изображение в течение определенного времени. Прошу прощения за подтверждение задержки и еще раз спасибо за ваше предложение. –