我需要为摄影测量应用程序生成一系列测试图像。这些图像应包含简单的对象(圆盘,矩形等),其位置非常精确。
考虑到黑色矩形在白色背景上的8位灰度图像,在插值后最小可观测位移应为1/256像素,因为每个像素有256个可能的强度级别。
我决定使用OpenGL(具有python + pyglet)来渲染这些图像,因为后来我将不得不渲染更复杂的(3D场景,立体图像对)。
不幸的是,我已经实现的最佳精度大约是每个像素/10,完整的强度深度没有被使用。
是否可能做得更好,理想情况下 - 实现完全的1/256像素的准确性?如果有,请提供如何达到这一目标的任何提示?
示例代码,生成部分圆盘图像,每帧移动0.01个像素。
考虑到黑色矩形在白色背景上的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,但我也使用了四边形测试了该问题,结果的准确性没有区别。