further progress on the refactoring of the fancy imshow.

This commit is contained in:
sccolbert
2009-11-06 16:19:41 +01:00
parent e21ab2e2ad
commit ae9f9cc2ca
4 changed files with 119 additions and 115 deletions
+3 -3
View File
@@ -97,7 +97,7 @@ def multiply(np.ndarray[np.uint8_t, ndim=3] img,
@cython.boundscheck(False)
def brightness(np.ndarray[np.uint8_t, ndim=3] img,
np.ndarray[np.uint8_t, ndim=3] stateimg,
int offset, float factor):
float factor, int offset):
"""Modify the brightness of an image.
'factor' is multiplied to all channels, which are
then added by 'amount'. Overflow is clipped.
@@ -108,10 +108,10 @@ def brightness(np.ndarray[np.uint8_t, ndim=3] img,
Output image.
stateimg : (M, N, 3) ndarray of uint8
Input image.
offset : int
Ammount to add to each channel.
factor : float
Multiplication factor.
offset : int
Ammount to add to each channel.
"""
+113 -78
View File
@@ -40,10 +40,10 @@ class IntelligentSlider(QWidget):
self.value_label.setText(str(self.slider.value() * self.a + self.b))
self.value_label.setAlignment(QtCore.Qt.AlignCenter)
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.name_label)
self.layout.addWidget(self.slider)
self.layout.addWidget(self.value_label)
self.layout = QGridLayout(self)
self.layout.addWidget(self.name_label, 0, 0)
self.layout.addWidget(self.slider, 1, 0, QtCore.Qt.AlignHCenter)
self.layout.addWidget(self.value_label, 2, 0)
# bind this to the valueChanged signal of the slider
def slider_changed(self, val):
@@ -56,10 +56,11 @@ class IntelligentSlider(QWidget):
self.b = b
def set_value(self, val):
self.slider.setValue(int((val - self.a) / self.b))
self.slider.setValue(int((val - self.b) / self.a))
self.value_label.setText(str(val)[:4])
def val(self):
return self.value() * self.a + self.b
return self.slider.value() * self.a + self.b
class MixerPanel(QWidget):
@@ -74,6 +75,7 @@ class MixerPanel(QWidget):
self.img = img
self.mixer = ColorMixer(self.img)
self.callback = None
#---------------------------------------------------------------
# ComboBox
@@ -147,7 +149,7 @@ class MixerPanel(QWidget):
# sliders
cont = IntelligentSlider('x', 0.002, 0, self.bright_changed)
bright = IntelligentSlider('+', 0.51, -155, self.bright_changed)
bright = IntelligentSlider('+', 0.51, -255, self.bright_changed)
self.cont = cont
self.bright = bright
@@ -158,21 +160,21 @@ class MixerPanel(QWidget):
self.bright_widget.layout.addWidget(self.bright, 0, 1)
'''
#---------------------------------------------------------------
# Gamma sliders
#---------------------------------------------------------------
# sliders
self.gamma_sliders = NSliderBlock(2,
[(100, 1200, 100, 'alpha', 0.01),
(0, 1200, 0, 'beta', 0.01)],
self.gamma_changed)
alpha = IntelligentSlider('alpha', 0.011, 1, self.gamma_changed)
beta = IntelligentSlider('beta', 0.012, 0, self.gamma_changed)
self.a_gamma = alpha
self.b_gamma = beta
# layout
self.gamma_widget = QWidget()
self.gamma_widget.layout = QtGui.QGridLayout(self.gamma_widget)
self.gamma_widget.layout.addWidget(self.gamma_sliders, 0, 0)
'''
self.gamma_widget.layout.addWidget(self.a_gamma, 0, 0)
self.gamma_widget.layout.addWidget(self.b_gamma, 0, 1)
#---------------------------------------------------------------
# Buttons
@@ -189,6 +191,7 @@ class MixerPanel(QWidget):
self.sliders.addWidget(self.rgb_widget)
self.sliders.addWidget(self.hsv_widget)
self.sliders.addWidget(self.bright_widget)
self.sliders.addWidget(self.gamma_widget)
self.layout = QtGui.QGridLayout(self)
self.layout.addWidget(self.combo_box, 0, 0)
@@ -197,91 +200,123 @@ class MixerPanel(QWidget):
self.layout.addWidget(self.revert_button, 3, 0)
#---------------------------------------------------------------
# Initialization
# State Initialization
#---------------------------------------------------------------
self.combo_box.setCurrentIndex(0)
self.sliders.setCurrentIndex(2)
#self.hide_sliders()
#self.rgb_widget.show()
#self.rgb_mul.setChecked(True)
#self.hsv_mul.setChecked(True)
self.rgb_mul.setChecked(True)
self.hsv_mul.setChecked(True)
def set_callback(self, callback):
self.callback = callback
def combo_box_changed(self, index):
self.sliders.setCurrentIndex(index)
self.reset_sliders()
def rgb_radio_changed(self):
self.reset_sliders()
def hsv_radio_changed(self):
self.reset_sliders()
def reset_sliders(self):
# handle changing the conversion factors necessary
if self.rgb_add.isChecked():
self.rs.set_conv_fac(0.51, -255)
self.rs.set_value(0)
self.gs.set_conv_fac(0.51, -255)
self.gs.set_value(0)
self.bs.set_conv_fac(0.51, -255)
self.bs.set_value(0)
else:
self.rs.set_conv_fac(0.002, 0)
self.rs.set_value(1.)
self.gs.set_conv_fac(0.002, 0)
self.gs.set_value(1.)
self.bs.set_conv_fac(0.002, 0)
self.bs.set_value(1.)
self.hs.set_value(0)
if self.hsv_add.isChecked():
self.ss.set_conv_fac(0.002, -1)
self.ss.set_value(0)
self.vs.set_conv_fac(0.002, -1)
self.vs.set_value(0)
else:
self.ss.set_conv_fac(0.002, 0)
self.ss.set_value(1.)
self.vs.set_conv_fac(0.002, 0)
self.vs.set_value(1.)
self.bright.set_value(0)
self.cont.set_value(1.)
self.a_gamma.set_value(1)
self.b_gamma.set_value(0)
def rgb_changed(self, name, val):
pass
if name == 'R':
channel = self.mixer.RED
elif name == 'G':
channel = self.mixer.GREEN
else:
channel = self.mixer.BLUE
if self.rgb_mul.isChecked():
self.mixer.multiply(channel, val)
elif self.rgb_add.isChecked():
self.mixer.add(channel, val)
else:
pass
if self.callback:
self.callback()
def hsv_changed(self, name, val):
pass
h = self.hs.val()
s = self.ss.val()
v = self.vs.val()
if self.hsv_mul.isChecked():
self.mixer.hsv_multiply(h, s, v)
elif self.hsv_add.isChecked():
self.mixer.hsv_add(h, s, v)
else:
pass
if self.callback:
self.callback()
def bright_changed(self, name, val):
# doesnt matter which slider changed we need both
# values
factor = self.bright_sliders.sliders['x'].conv_val()
offset = self.bright_sliders.sliders['+'].conv_val()
self.mixer.brightness(offset, factor)
self.update()
b = self.bright.val()
c = self.cont.val()
self.mixer.brightness(c, b)
if self.callback:
self.callback()
def gamma_changed(self, name, val):
# doesnt matter which slider changed we need both
# values
alpha = self.gamma_sliders.sliders['alpha'].conv_val()
beta = self.gamma_sliders.sliders['beta'].conv_val()
self.mixer.sigmoid_gamma(alpha, beta)
self.update()
ag = self.a_gamma.val()
bg = self.b_gamma.val()
self.mixer.sigmoid_gamma(ag, bg)
if self.callback:
self.callback()
def iter_all_sliders(self):
pass
def reset_sliders(self):
self.rgb_add_sliders.set_sliders({'R': 0, 'G': 0, 'B': 0})
self.rgb_mul_sliders.set_sliders({'R': 500, 'G': 500, 'B': 500})
self.hsv_add_sliders.set_sliders({'H': 0, 'S': 0, 'V': 0})
self.hsv_mul_sliders.set_sliders({'H': 0, 'S': 500, 'V': 500})
self.bright_sliders.set_sliders({'+': 0, 'x': 500})
self.gamma_sliders.set_sliders({'alpha': 100, 'beta': 0})
def combo_box_changed(self, index):
self.reset_sliders()
self.mixer.set_to_stateimg()
self.update()
combo_box_map={0: self.show_rgb, 1: self.show_hsv,
2: self.show_bright, 3: self.show_gamma}
combo_box_map[index]()
def hide_sliders(self):
self.rgb_widget.hide()
self.hsv_widget.hide()
self.bright_widget.hide()
self.gamma_sliders.hide()
pass
def rgb_radio_changed(self):
if self.rgb_add.isChecked():
self.rgb_add_sliders.show()
self.rgb_mul_sliders.hide()
elif self.rgb_mul.isChecked():
self.rgb_mul_sliders.show()
self.rgb_add_sliders.hide()
else:
pass
self.reset_sliders()
self.mixer.set_to_stateimg()
self.update()
def hsv_radio_changed(self):
if self.hsv_add.isChecked():
self.hsv_add_sliders.show()
self.hsv_mul_sliders.hide()
elif self.hsv_mul.isChecked():
self.hsv_mul_sliders.show()
self.hsv_add_sliders.hide()
else:
pass
self.reset_sliders()
self.mixer.set_to_stateimg()
self.update()
def show_rgb(self):
self.hide_sliders()
+1 -32
View File
@@ -251,6 +251,7 @@ else:
self.mixer_panel = MixerPanel(self.arr)
self.layout.addWidget(self.mixer_panel, 0, 2)
self.mixer_panel.show()
self.mixer_panel.set_callback(self.refresh_image)
self.rgb_hist = MultiHist(self.calc_hist())
self.layout.addWidget(self.rgb_hist, 0, 1)
@@ -271,38 +272,6 @@ else:
self.layout.addWidget(self.save_variable, 1, 1)
self.layout.addWidget(self.save_file, 1, 2)
''''
# hook up the mixer sliders move events to trigger a
# histogram redraw.
self.mixer_panel.rgb_add_sliders.sliders['R'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.rgb_add_sliders.sliders['G'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.rgb_add_sliders.sliders['B'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.rgb_mul_sliders.sliders['R'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.rgb_mul_sliders.sliders['G'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.rgb_mul_sliders.sliders['B'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.hsv_add_sliders.sliders['H'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.hsv_add_sliders.sliders['S'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.hsv_add_sliders.sliders['V'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.hsv_mul_sliders.sliders['H'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.hsv_mul_sliders.sliders['S'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.hsv_mul_sliders.sliders['V'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.bright_sliders.sliders['+'].\
sliderMoved.connect(self.update_histogram)
self.mixer_panel.bright_sliders.sliders['x'].\
sliderMoved.connect(self.update_histogram)
'''
def update_histogram(self):
self.rgb_hist.update_hists(self.calc_hist())
+2 -2
View File
@@ -243,7 +243,7 @@ class ColorMixer(object):
_colormixer.multiply(self.img, self.stateimg, channel, ammount)
def brightness(self, offset, factor):
def brightness(self, factor, offset):
'''Adjust the brightness off an image with an offset and factor.
Parameters
@@ -256,7 +256,7 @@ class ColorMixer(object):
result = clip((pixel + offset)*factor)
'''
_colormixer.brightness(self.img, self.stateimg, offset, factor)
_colormixer.brightness(self.img, self.stateimg, factor, offset)
def sigmoid_gamma(self, alpha, beta):
_colormixer.sigmoid_gamma(self.img, self.stateimg, alpha, beta)