Для тех, кто в сообществе 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 для целей, чтобы мы могли подсчитать, сколько пикселей в заполненном изображении было заполнено. Чтобы определить, сколько изображений было заполнено, мы подсчитываем, сколько ненулевых пикселей есть и видят, насколько эта пропорция и сравнима с нашей желаемой пропорцией. Если он равен или больше, мы останавливаемся. Если нет, мы продолжаем генерировать эллипсы, пока эта пропорция не будет удовлетворена.
Со всем этим, это то, что я получаю с прохождением вышеуказанного кода.
У меня много идей. Какой правильный вопрос? BTW, эллипсоид - это трехмерный объект. Может быть, эллипс? –
Что я имел в виду, это 2D эллипс. На самом деле у меня есть распределения малой и большой оси, и я хочу использовать их и генерировать кучу случайных эллипсов на сетке (например, 200x200). Я хочу видеть другое изображение всякий раз, когда я его запускаю (он должен зависеть от количества семян) – Sam
Итак, каков требуемый результат? Графическое представление? Где вы застряли? –