From cf19f11bbbbec178ca1ec9d9c4efbf1c810e6053 Mon Sep 17 00:00:00 2001 From: sccolbert Date: Fri, 6 Nov 2009 17:31:27 +0100 Subject: [PATCH] added regular gamma to the mixer, refactored more of fancy imshow. --- scikits/image/io/_plugins/_colormixer.pyx | 22 ++++++ scikits/image/io/_plugins/q_color_mixer.py | 79 ++++++++++------------ scikits/image/io/_plugins/util.py | 3 + 3 files changed, 62 insertions(+), 42 deletions(-) diff --git a/scikits/image/io/_plugins/_colormixer.pyx b/scikits/image/io/_plugins/_colormixer.pyx index 08e3cc8f..ec3d698c 100644 --- a/scikits/image/io/_plugins/_colormixer.pyx +++ b/scikits/image/io/_plugins/_colormixer.pyx @@ -16,6 +16,7 @@ import cython cdef extern from "math.h": float exp(float) + float pow(float, float) @cython.boundscheck(False) @@ -168,6 +169,27 @@ def sigmoid_gamma(np.ndarray[np.uint8_t, ndim=3] img, img[i,j,2] = (b * 255) +@cython.boundscheck(False) +def gamma(np.ndarray[np.uint8_t, ndim=3] img, + np.ndarray[np.uint8_t, ndim=3] stateimg, + float gamma): + + cdef int height = img.shape[0] + cdef int width = img.shape[1] + + cdef float r, g, b + + cdef int i, j + for i in range(height): + for j in range(width): + r = stateimg[i,j,0] / 255. + g = stateimg[i,j,1] / 255. + b = stateimg[i,j,2] / 255. + + img[i,j,0] = (pow(r, gamma) * 255) + img[i,j,1] = (pow(g, gamma) * 255) + img[i,j,2] = (pow(b, gamma) * 255) + cdef void rgb_2_hsv(float* RGB, float* HSV): diff --git a/scikits/image/io/_plugins/q_color_mixer.py b/scikits/image/io/_plugins/q_color_mixer.py index 12c6e25a..d041fb26 100644 --- a/scikits/image/io/_plugins/q_color_mixer.py +++ b/scikits/image/io/_plugins/q_color_mixer.py @@ -83,6 +83,7 @@ class MixerPanel(QWidget): self.combo_box_entries = ['RGB Color', 'HSV Color', 'Brightness/Contrast', + 'Gamma', 'Gamma (Sigmoidal)'] self.combo_box = QtGui.QComboBox() for entry in self.combo_box_entries: @@ -160,21 +161,33 @@ class MixerPanel(QWidget): self.bright_widget.layout.addWidget(self.bright, 0, 1) - #--------------------------------------------------------------- - # Gamma sliders - #--------------------------------------------------------------- - - # sliders - 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 + #----------------------------------------------------------------------- + # Gamma Slider + #----------------------------------------------------------------------- + gamma = IntelligentSlider('gamma', 0.005, 0, self.gamma_changed) + self.gamma = gamma # layout self.gamma_widget = QWidget() self.gamma_widget.layout = QtGui.QGridLayout(self.gamma_widget) - self.gamma_widget.layout.addWidget(self.a_gamma, 0, 0) - self.gamma_widget.layout.addWidget(self.b_gamma, 0, 1) + self.gamma_widget.layout.addWidget(self.gamma, 0, 0) + + + #--------------------------------------------------------------- + # Sigmoid Gamma sliders + #--------------------------------------------------------------- + + # sliders + alpha = IntelligentSlider('alpha', 0.011, 1, self.sig_gamma_changed) + beta = IntelligentSlider('beta', 0.012, 0, self.sig_gamma_changed) + self.a_gamma = alpha + self.b_gamma = beta + + # layout + self.sig_gamma_widget = QWidget() + self.sig_gamma_widget.layout = QtGui.QGridLayout(self.sig_gamma_widget) + self.sig_gamma_widget.layout.addWidget(self.a_gamma, 0, 0) + self.sig_gamma_widget.layout.addWidget(self.b_gamma, 0, 1) #--------------------------------------------------------------- # Buttons @@ -192,6 +205,7 @@ class MixerPanel(QWidget): self.sliders.addWidget(self.hsv_widget) self.sliders.addWidget(self.bright_widget) self.sliders.addWidget(self.gamma_widget) + self.sliders.addWidget(self.sig_gamma_widget) self.layout = QtGui.QGridLayout(self) self.layout.addWidget(self.combo_box, 0, 0) @@ -253,8 +267,9 @@ class MixerPanel(QWidget): self.bright.set_value(0) self.cont.set_value(1.) + self.gamma.set_value(1) self.a_gamma.set_value(1) - self.b_gamma.set_value(0) + self.b_gamma.set_value(0.5) def rgb_changed(self, name, val): @@ -299,6 +314,12 @@ class MixerPanel(QWidget): self.callback() def gamma_changed(self, name, val): + self.mixer.gamma(val) + + if self.callback: + self.callback() + + def sig_gamma_changed(self, name, val): ag = self.a_gamma.val() bg = self.b_gamma.val() self.mixer.sigmoid_gamma(ag, bg) @@ -306,39 +327,13 @@ class MixerPanel(QWidget): if self.callback: self.callback() - def iter_all_sliders(self): - pass - - - - - - def hide_sliders(self): - pass - - - - def show_rgb(self): - self.hide_sliders() - self.rgb_widget.show() - - def show_hsv(self): - self.hide_sliders() - self.hsv_widget.show() - - def show_bright(self): - self.hide_sliders() - self.bright_widget.show() - - def show_gamma(self): - self.hide_sliders() - self.gamma_sliders.show() - def commit_changes(self): self.mixer.commit_changes() - self.update() + self.reset_sliders() def revert_changes(self): self.mixer.revert() self.reset_sliders() - self.update() \ No newline at end of file + + if self.callback: + self.callback() \ No newline at end of file diff --git a/scikits/image/io/_plugins/util.py b/scikits/image/io/_plugins/util.py index 32124038..db8ed0eb 100644 --- a/scikits/image/io/_plugins/util.py +++ b/scikits/image/io/_plugins/util.py @@ -261,6 +261,9 @@ class ColorMixer(object): def sigmoid_gamma(self, alpha, beta): _colormixer.sigmoid_gamma(self.img, self.stateimg, alpha, beta) + def gamma(self, gamma): + _colormixer.gamma(self.img, self.stateimg, gamma) + def hsv_add(self, h_amt, s_amt, v_amt): '''Adjust the H, S, V channels of an image by a constant ammount. This is similar to the add() mixer function, but operates over the