所以我创建了一个2D动画,它由3D Perlin噪声组成,其中X和Y轴是矩阵/屏幕上的像素位置,Z轴只是随着时间的推移而计数。然后我应用一个阈值,这样它就只显示实心形状,而不是正常噪声的云型模式。实际上,它创建了一个永远移动的流体动画,就像这样https://i.imgur.com/J9AqY5s.gifv
我一直在想一种方法,我可以跟踪和索引不同的形状,这样我就可以让它们都是不同的颜色。我尝试过在图像上循环并泛洪填充每个形状,但这只适用于一帧,因为它不跟踪哪个形状是哪个形状,以及它们是如何增长和缩小的。
我想肯定有办法做到这一点,因为如果我有一支着色铅笔,每一帧都在一张纸上,我将能够对每个斑点进行着色和跟踪,并在两个斑点连接时组合颜色。我就是想不出如何通过编程来做到这一点。Perlin-noise工作的本质,由于形状不是定义的对象,我发现很难理解如何对它们进行索引。
希望我的解释已经足够,任何建议或帮助都将不胜感激。
发布于 2017-11-08 06:29:15
您当前的算法有效地将帧中的每个像素标记为斑点或背景的一部分。假设您有第二个帧缓冲区,可以为每个像素位置保存一种颜色。正如您所提到的,您可以在斑点/背景缓冲区上使用泛洪填充来查找属于某个斑点的所有像素。
对于第一帧,为找到的每个斑点指定颜色,并将它们保存在颜色缓冲区中。
对于第二帧(以及后续的每个帧),可以再次对斑点/背景缓冲区使用整体填充,以确定属于离散斑点的所有像素。从颜色缓冲区(代表最后一帧的颜色)中查找与这些像素中的每一个像素相对应的颜色,并构建找到的所有颜色的直方图。
直方图将包含背景颜色的一些像素(因为斑点可能已经移动或增长到背景区域)。
但是由于斑点的移动是平滑的,所以作为给定斑点的一部分的许多像素在此帧中将成为最后一帧中相同斑点的一部分。因此,如果您的直方图只有一个非背景色,那就是您将使用的颜色。
如果直方图仅包含背景颜色,则这是一个新的blob,您可以为其分配新的颜色。
如果直方图包含两种(或更多)斑点颜色,那么两个(或更多)斑点已经合并,您可以混合它们的颜色(可能与它们的直方图计数成比例,与它们的区域相对应)。
这个技巧就是高效地完成所有这些工作。我在这里概述的算法给出了这个想法。实际的实现可能不会字面上构建直方图,并且可能需要在每个帧上重新计算每个像素颜色的帧划痕。
https://stackoverflow.com/questions/47166484
复制相似问题