将像素网格转换为轮廓?

时间:2014-08-01 22:09:48

标签: python arrays

我有一个像素网格,可以是任何类型的2D数组(例如numpy数组),每个值代表一种颜色(最多5种不同的颜色)。我希望在OpenGL上下文中显示它,但逐像素绘制既低效又愚蠢。我想要做的是将相同颜色的所有相邻像素重新组合成一个形状,这样我就可以绘制这些形状。

基本上,我希望能够这样做: enter image description here 从2D数组点到形状列表(形状是顶点列表)。

我不知道如何继续,所以我正在寻找可以完成任务的任何东西,比如任何语言的任何算法或任何可以做到这一点的Python库。

2 个答案:

答案 0 :(得分:1)

我知道您正在寻求矢量解决方案,但我相信简单明了的方法可以很好地为您服务,并且可能会表现得更好。

我会将您的颜色数据加载到纹理中,使用类似的调用序列(抱歉C符号,但您应该能够轻松地将其转换为python绑定):

GLuint texId = 0;
glGenTexture(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, colorData);

其中widthheight是水平和垂直方向的平方数,colorData是一个数组,每个方格的颜色为RGB格式。

然后选择正确的采样参数非常重要。由于这里需要纹素之间的锐边,我们希望"最接近"采样,而不是"线性"这更常用于图像类型纹理。这将导致正方形之间的急剧过渡,而不是在它们之间插入颜色:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

然后,为了渲染网格,使用此纹理渲染一个纹理四边形。

我可以想到的唯一优势是,矢量解决方案可以使用多重采样抗锯齿(又名MSAA)。由于MSAA仅对原始边缘进行抗锯齿处理,因此对于边缘"你有两个正方形之间的颜色过渡。使用基于矢量的解决方案,您可以将每个区域渲染为单独的图元,您将获得这些边缘的抗锯齿。

只要你只是在显示期间缩放图像,但是别名应该不是问题。如果您还想旋转它,那只会真正发挥作用。

答案 1 :(得分:0)

我建议您在np.extract中使用numpy功能,我认为它会有所帮助!这是一个例子:

import numpy as np
arr = np.arange(12).reshape((3, 4))
condition = np.mod(arr, 3)==0 # base on this condition the function extract the special arrays
print np.extract(condition, arr)

这就是结果:

[0 3 6 9]

然后你可以用numpy.concatenate((a1, a2, ...), axis=0)函数连接这个数组!详情请见:http://docs.scipy.org/doc/numpy/reference/index.html