Найти - Пользователи
Полная версия: Яркость изображения
Начало » Python для экспертов » Яркость изображения
1 2 3 4
Levelup
Всем доброго времени суток!

Необходимо реализовать управление яркостью изображения посредством OpenGL. Нашел несколько вариантов на С. Но сделать на питоне так и не получилось. Подскажите, пожалуйста, куда копать. Может кто-нибудь сталкивался с каким-либо подобным примером.


http://stackoverflow.com/questions/1506299/applying-brightness-and-contrast-with-opengl-es - пример на c++, где говорят, что изменение яркости прекрасно работает.
Андрей Светлов
А где там С++? :)
Один раз домешивают текстуру на fixed pipeline, второй раз - пиксельным шейдером. С шейдером возни чуть больше.
А что не получилось то?
Levelup
Да я вообще в OpenGL полный ноль. Хотелось бы примерчик какой-нибудь поглядеть..
Андрей Светлов
Ууу. С примерами я вам не советчик. Может, кто другой подскажет…
Levelup
А приведенный код должен помочь и откуда берется переменная brightness? Я так понимаю код необходимо писать в OnPaint, где у меня происходит инициализация opengl? Или я могу создать отдельную функцию, чтоб забиндить слайдер на неё?
Спасибо.
Levelup
Ну может хоть кто-то знает где про изменение яркости почитать. Весь гугл перелопатил уже.
Андрей Светлов
http://nehe.gamedev.net/
Читайте tutorials, пока не придет просветление.
Levelup
Поглядел примеры. К сожалению, там нет того, что мне нужно. Вот рабочий пример изображения, яркость которого необходимо изменить. Оно создается из двумерного массива и похоже, чтобы всё это реализовать необходимо использовать пиксельный шейдер.

import wx
from wx.glcanvas import GLCanvas
from OpenGL.GL import *
from numpy import *

class ButtonPanel(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
c = MyCanvasBase(self)

class MyCanvasBase(GLCanvas):
_dx = _dy = 0
_image = None

def __init__(self, parent):
GLCanvas.__init__(self, parent)
self.Bind(wx.EVT_PAINT, self.OnPaint)

def OnPaint(self, event):
w = h = 512
i, j = indices()
image = i*j
image = (image*65535.0/image.max()).astype(uint16)
image = 65535

# Calculate the image contrast as 0.8% histogram level
hist = cumsum(histogram(image, 65536, (0, 65536)))
h, w = image.shape
area = w*h
level = 0.008
b = searchsorted(hist, round(level*area))
r = max(searchsorted(hist, round((1.0 - level)*area)) - b, 1)

# Scale image according to brightness and contrast and convert to 16-bit
# unsigned
self._image = ((clip(image, b, b+r) - b)*(65535.0/r)).astype(uint16)

dc = wx.PaintDC(self)
self.SetCurrent()

glEnable(GL_TEXTURE_2D)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, self._image.shape,
self._image.shape, 0, GL_LUMINANCE,
GL_UNSIGNED_SHORT, self._image)

glClear(GL_COLOR_BUFFER_BIT)
glLoadIdentity()
glBegin(GL_QUADS)
glTexCoord2i(0, 1); glVertex2i(-1, -1)
glTexCoord2i(1, 1); glVertex2i( 1, -1)
glTexCoord2i(1, 0); glVertex2i( 1, 1)
glTexCoord2i(0, 0); glVertex2i(-1, 1)
glEnd()
self.SwapBuffers()

app = wx.App(False)
try:
frame = ButtonPanel(None, -1, size=(400,400))
frame.Show(True)
app.MainLoop()
finally:
del app
Андрей Светлов
Очень здорово, что появился пример!
Завтра на него посмотрю внимательно.
Levelup
Заранее спасибо! Жду ответа.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB