将像素网格转换为轮廓?

2024-04-19 08:01:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

基本上,我希望能够做到: enter image description here 从一个二维点数组到一系列的形状(一个形状是一个顶点列表)。在

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


Tags: numpy算法语言网格类型列表颜色绘制
1条回答
网友
1楼 · 发布于 2024-04-19 08:01:30

我知道你要求的是一个向量的解决方案,但我相信简单明了的方法对你来说很好,而且可能会表现得更好。在

我将使用如下调用序列将颜色数据加载到纹理中(很抱歉使用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格式的。在

那么选择正确的采样参数就很重要了。由于纹理之间的锐利边缘在这里是可取的,所以我们需要“最近”采样,而不是更常用于图像类型纹理的“线性”采样。这将导致正方形之间的急剧过渡,而不是在它们之间插值颜色:

^{pr2}$

然后,若要渲染栅格,请使用该纹理渲染一个带纹理的四边形。在

我能想到的唯一优势是矢量解决方案比这是如果你想使用多采样消除混叠(又名MSAA)。由于MSAA只对基本体边执行抗锯齿处理,因此对于在两个正方形之间有颜色过渡的“边”来说,这并没有帮助。使用基于矢量的解决方案,将每个区域渲染为单独的基本体,可以对这些边进行抗锯齿处理。在

不过,只要在显示过程中缩放图像,锯齿就不会成为问题。只有当你想旋转它的时候,它才会真正发挥作用。在

网友
2楼 · 发布于 2024-04-19 08:01:30

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

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)

结果是:

^{pr2}$

然后您可以用numpy.concatenate((a1, a2, ...), axis=0)函数连接这个数组!更多信息请访问:http://docs.scipy.org/doc/numpy/reference/index.html

相关问题 更多 >