我需要为摄影测量应用程序生成几组测试图像。这些应该包含位置非常精确的简单对象(磁盘、矩形等)。
考虑到白色背景上黑色矩形的 8 位灰度图像,最小可观察位移(插值后)应该是 1/256 像素,因为每个像素有 256 个可能的强度级别。
我决定使用 OpenGL(使用 python + pyglet)来渲染这样的图像,因为稍后我将不得不渲染更复杂的(3d 场景,立体图像对)
不幸的是,我达到的最佳精度大约是像素/10,没有使用完整的强度深度。
理想情况下是否有可能做得更好 - 实现完整的 1/256 像素精度?请提供有关如何执行此操作的任何提示?
示例代码,生成部分磁盘的图像,每帧多移动 0.01 像素
#-*- coding: utf-8 -*-
import pyglet
from pyglet.gl import *
from PIL import Image, ImageGrab
config = pyglet.gl.Config(width = 800, height = 600, sample_buffers=1, samples=16)
window = pyglet.window.Window(config=config, resizable=True)
window.set_size(800, 600)
printScreenNr = 0
@window.event
def on_draw():
global printScreenNr
window.clear()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity()
glEnable(GL_LINE_SMOOTH)
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glTranslated(200, 200,0)
circleQuad = gluNewQuadric()
glTranslated(200+(printScreenNr*0.01), 0, 0)
gluPartialDisk(circleQuad, 0, 50, 500, 500, 0, 180)
@window.event
def on_resize(width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho (0, width, height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW)
return pyglet.event.EVENT_HANDLED
@window.event
def on_text(text):
global printScreenNr
if(text == "p"):
pyglet.image.get_buffer_manager().get_color_buffer().save('photo'+str(printScreenNr)+'.tiff')
printScreenNr += 1
pyglet.app.run()
(上面的代码使用 gluPartialDisk,但我也使用四边形测试了这个问题,结果的准确性没有差异)