Tôi cần tạo một vài hình ảnh thử nghiệm cho ứng dụng hình ảnh. Những nội dung này phải chứa các đối tượng đơn giản (đĩa, hình chữ nhật, v.v.) với vị trí rất chính xác.Hiển thị pixel phụ trong OpenGL - vấn đề về độ chính xác
Xem xét hình ảnh thang độ xám 8 bit của hình chữ nhật màu đen trên nền trắng, chuyển vị quan sát nhỏ nhất (sau khi nội suy) phải là 1/256 pixel, vì có 256 mức cường độ có thể có của mỗi pixel.
tôi quyết định sử dụng OpenGL (với python + pyglet) để render hình ảnh như vậy, như sau này tôi sẽ phải làm phức tạp hơn (cảnh 3d, cặp ảnh stereo)
Thật không may, độ chính xác tốt nhất mà tôi đã đạt được khoảng pixel/10, độ sâu cường độ đầy đủ không được sử dụng.
Có thể làm tốt hơn, lý tưởng - đạt được độ chính xác 1/256 pixel đầy đủ không? Bất kỳ gợi ý về cách làm điều đó, xin vui lòng?
mẫu mã, tạo ra hình ảnh của một đĩa cục bộ, di chuyển 0,01 điểm ảnh nhiều hơn trong mỗi khung
#-*- 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()
(mã trên được sử dụng gluPartialDisk, nhưng tôi đã thử nghiệm vấn đề này cũng sử dụng tứ, chính xác kết quả đã làm không khác nhau)
Bạn đã thử sử dụng độ sâu màu 32 bit chưa? Lý do tôi nói điều này là các đường dẫn 32 bit là các đường dẫn mã được sử dụng nhiều nhất và do đó được duy trì nhiều nhất trong các trình điều khiển đồ họa hiện nay. Nếu công trình này hoạt động, sau đó bạn có thể thực hiện rescale độ sâu màu chất lượng cao sau đó. – Ani
đã thử điều đó, nhưng không thay đổi kết quả ... vẫn còn, cảm ơn bạn – Pietro