2015-02-23 3 views
0

Я собираюсь генерировать случайные эллипсы в Matlab. У меня есть информация о распределении большого радиуса эллипса, распределении малого радиуса эллипса и пропорции (например, я хочу остановить этот процесс после того, как определенная сумма или пропорция сетки заполнена).Создание случайных эллипсов в Matlab

Я попытался следующий код для круга:

out_size = [200 200]; 
out = zeros(out_size(1),out_size(2)); 
[xx,yy] = meshgrid(1:out_size(1),1:out_size(2)); 
for i=1:40 
    obj = [random('unif',1,200) random('unif',1,200),random('unif',4,8)]; 
    d = sqrt((xx-obj(1)).^2 + (yy-obj(2)).^2); 
    out(d <= obj(3))=1; 
end 
figure, imagesc(out), axis equal tight xy 

Любые идеи?

+2

У меня много идей. Какой правильный вопрос? BTW, эллипсоид - это трехмерный объект. Может быть, эллипс? –

+0

Что я имел в виду, это 2D эллипс. На самом деле у меня есть распределения малой и большой оси, и я хочу использовать их и генерировать кучу случайных эллипсов на сетке (например, 200x200). Я хочу видеть другое изображение всякий раз, когда я его запускаю (он должен зависеть от количества семян) – Sam

+1

Итак, каков требуемый результат? Графическое представление? Где вы застряли? –

ответ

2

Для тех, кто в сообществе StackOverflow, которые кажутся смущенными, я буду перефразировать то, что задает вопрос (идите Mentalist!).


OP желает нарисовать случайные эллипсы на изображении. Для каждого эллипса мы можем охарактеризовать его по его основной длине, малой длине и ее центру. Для каждого эллипса OP хочет случайным образом выбирать из распределения (Uniform, Gaussian и т. Д.), Чтобы получить большую длину, небольшую длину и центральные местоположения. Как только они сгенерированы, OP хочет нарисовать их на изображении.

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


Вы, кажется, находитесь на правильном пути. Однако то, что я хотел бы сделать, сначала сгенерирует основные, второстепенные и центральные координаты. После этого вы можете использовать цикл для циклизации каждого квартета параметров, генерировать правильные пространственные местоположения для эллипса, а затем использовать эти места для индексации в ваше изображение и установить интенсивность. Я буду играть игриво, и я буду рандомизировать интенсивность, чтобы установить для каждого эллипса. Однако, чтобы убедиться, что вы видите эллипс, я ограничу интенсивности, возникающие между [32,255].

Кроме того, я бы порекомендовал вам образец выборки из гауссова распределения для основной и меньшей длины, так как для определения их требуется, чтобы они были положительными. Теперь, чтобы рассмотреть, уравнение эллипса, учитывая центральную точку (x_0, y_0) и крупные и мелкие длины (a,b) определяется как:

Обратите внимание, что если a > b, главная ось горизонтальна и, таким образом Вы получаете горизонтально широкий эллипс. Если b > a, основная ось вертикальна, и вы получите вертикально широкий эллипс. Однако это не повлияет на наш код.

Теперь, что мы будем делать это, мы будем иметь while цикл, который держит итерация и не заселять изображение до определенная часть вашего изображения полна. Затем мы останавливаемся после того, как заполним много пикселей. На данный момент я выберу 40% общего изображения.

Поэтому сделайте что-нибудь вроде этого, считая, что вы знаете максимальные a и b для использования на изображении. Я бы их оба равны, так что у вас есть равное изменение генерирующий по горизонтали и по вертикали широкие эллипсы:

%// Declare output image 
out = zeros(200,200); 

%// Declare a and b 
a = 20; 
b = 20; 

%// Declare reference coordinates 
[X,Y] = meshgrid(1:size(out,2), 1:size(out,1)); 

%// Proportion 
prop = 0.4; 

%// Set seed for reproducibility 
rng(123123); 

while true 
    %// Generate random a, b and centre 
    x_axis = a*rand; 
    y_axis = b*rand; 
    centre = [size(out,2)*rand size(out,1)*rand]; 

    %// Define coordinates with respect to this centre 
    Xmove = X - centre(1); 
    Ymove = Y - centre(2); 

    %// Check ellipse equation and filter out those locations 
    %// that satisfy result 
    ind = (((Xmove.^2)/x_axis^2) + ((Ymove.^2)/y_axis^2)) <= 1; 

    %// Set these locations in the output image to a random intensity 
    intensity = floor(223*rand) + 32;   
    out(ind) = intensity; 

    %// Check proportion 
    if sum((out(:) > 0)/numel(out)) >= prop 
     break; 
    end 
end 

%// Cast and show the output 
out = uint8(out); 
imshow(out); 

Этот код, вероятно, требует некоторого пояснения.Сначала мы объявляем выходное изображение заданного размера, а также объявляем минимальное и максимальное значения a и b. Мы также определяем meshgrid точек, чтобы мы могли использовать это для генерации наших пространственных координат для каждого генерируемого эллипса.

Мы определяем пропорцию, в которой мы хотим, чтобы изображение было заполнено до того, как мы закончили работу, поэтому я выбрал здесь 40%, и я установил случайное семя 123123 - rng.

Теперь мы продолжим цикл до тех пор, пока доля пикселей, которые заполняются изображением, не будет равна или превышает эту пропорцию. На каждой итерации цикла мы генерируем наши a, b и наши центры, обеспечивающие их уважение к границам изображения. Затем мы смещаем нашу опорную сетку координат так, чтобы случайный центр стал началом, и мы проверяем, какие точки в этой новой сетке координат удовлетворяют уравнению эллипса. Каким бы ни были точки, удовлетворяющие уравнению, мы устанавливаем эти точки в изображении на случайную интенсивность между [32,255]. Имейте в виду, что я выбрал менее, чтобы мы могли заполнить эллипс. Я также постарался выбрать минимальную интенсивность 32 для целей, чтобы мы могли подсчитать, сколько пикселей в заполненном изображении было заполнено. Чтобы определить, сколько изображений было заполнено, мы подсчитываем, сколько ненулевых пикселей есть и видят, насколько эта пропорция и сравнима с нашей желаемой пропорцией. Если он равен или больше, мы останавливаемся. Если нет, мы продолжаем генерировать эллипсы, пока эта пропорция не будет удовлетворена.

Со всем этим, это то, что я получаю с прохождением вышеуказанного кода.

enter image description here

+0

Хороший способ заполнить эллипсы ... считал почти то же самое, что и вычислять их, но думал, используя «аннотацию» («эллипс», [x y w h]) 'для рендеринга. – CitizenInsane

+0

Можно также добавить для случайной ориентации;) – CitizenInsane

+0

@CitizenInsane - О да, это может сработать! лол. Я этого не делал, потому что я решил, что OP хочет, чтобы изображение работало с суждением по их исходному коду. Это все еще хороший способ сделать это. Что касается ориентации ... ах ... это было бы круто, но я думаю, что оставлю это :) lol. Думаю, я сделал достаточно! – rayryeng

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