Как я могу отслеживать/раскрашивать отдельные фигуры, созданные с использованием шума перлина?

Итак, я создал 2D-анимацию, состоящую из 3D-шума Перлина, где оси X и Y представляют собой положения пикселей на матрице/экране, а ось Z просто подсчитывается с течением времени. Затем я применяю порог, чтобы он показывал только сплошные формы, в отличие от паттерна облачного типа обычного шума. По сути, он создает постоянно движущуюся плавную анимацию, например https://i.imgur.com/J9AqY5s.gifv

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

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

Надеюсь, моего объяснения было достаточно, любые предложения или помощь будут очень признательны.


person Toeb    schedule 07.11.2017    source источник
comment
Stack Overflow на самом деле не предназначен для общих вопросов о том, как мне это сделать. Это конкретно: я пробовал X, ожидал Y, но вместо вопросов типа Z получил Z. Лучшее, что я могу вам посоветовать, это попытаться разбить вашу проблему на более мелкие шаги а затем выполнять эти шаги по одному. Затем, если вы застряли, вы можете опубликовать минимально воспроизводимый пример вместе с конкретным техническим вопросом. Удачи.   -  person Kevin Workman    schedule 07.11.2017


Ответы (1)


Ваш текущий алгоритм эффективно помечает каждый пиксель в кадре как часть капли или часть фона. Допустим, у вас есть второй буфер кадров, который может хранить цвет для каждого пикселя. Как вы заметили, вы можете использовать заливку в буфере blob/background, чтобы найти все пиксели, принадлежащие blob.

Для первого кадра назначьте цвета каждому найденному пятну и сохраните их в цветовом буфере.

Для второго (и каждого последующего) кадра вы снова можете использовать сплошную заливку для большого двоичного объекта/фонового буфера, чтобы определить все пиксели, принадлежащие дискретному двоичному объекту. Найдите цвета, соответствующие каждому из этих пикселей, в цветовом буфере (который представляет цвета из последнего кадра) и постройте гистограмму всех найденных цветов.

Гистограмма будет содержать некоторые пиксели фонового цвета (поскольку капля могла переместиться или вырасти в область, которая была фоном).

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

Если гистограмма содержит только фоновый цвет, это новая капля, и вы можете назначить ей новый цвет.

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

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

person Adrian McCarthy    schedule 07.11.2017