我正在尝试在Python中检测到足够接近颜色的连续区域。我独立地偶然发现了8路递归泛光填充算法(当发现的和所需的RGB颜色之间的欧几里德距离超过阈值时终止),这在小规模下工作得很好,但在200万像素图像上导致堆栈溢出。
Stack Overflow和Wikipedia指向扫描线填充作为答案,但我发现的每个解释都是在C ++中或者用已知顶点填充多边形。有人能指出一个类似于递归洪水填充的情况的良好伪代码解释吗?
由于缺乏正式的数学(我在高中时期),我正在研究图像分割。如果对K-Means有类似的简单英语解释,那就是太好了。 OpenCV看起来很有前途,但看起来我得到的只是一个颜色扁平的图像;所有我关心的是x,y中对象中的像素列表。
答案 0 :(得分:7)
扫描线洪水填充的想法如下
这是4连接洪水填充的版本。对于8连接填充,您还需要在启动扫描线时检查(x-1,y-1)和(x-1,y + 1)处的洞穴,并且需要检查洞穴(x + 1,y) -1)和扫描线末端的(x + 1,y + 1)(如果相应的标志为真)。
在扫描线上移动时,您想要做的是将图片中的绿点添加到您的待办事项列表中:
请注意,种子的数量不会是“最小”(例如,示例中的前两个“上面的种子”将最终在同一个洞穴中,因此实际上只需要其中一个)。存储它们所需的堆栈量通常远小于逐像素递归方法所需的量。
限制所需内存量的另一种可能方法是使用前沿绘制算法:
current_active
列表中并将其绘制成next_active
列表以清空current_active
列表中的每个像素,检查需要绘制的邻居:当您找到一个绘制它并将其添加到next_active
列表current_active
列表到next_active
列表并从2重复,除非列表为空您可以在this video中查看两种算法的示例。