2015-07-24 3 views
0

Как я должен реализовать своего рода программу обработки изображений, мне нужно создать пользовательский интерфейс для изменения оттенка, насыщенности и значения.изменение значения изображения (hsv) в python

Для этого я нашел code, который я использовал и который отлично работает для изменения оттенка и насыщенности. Но всякий раз, когда я пытаюсь установить значение для v, изображение исчезает, и вместо него появляется только прямоугольник (с правильным цветом) в размере изображения. (Подобно контрасту будет установлено равным 0 одновременно). Я просмотрел использованный код, но не смог найти проблему.

import Image 
import numpy as np 

def rgb_to_hsv(rgb): 
    # Translated from source of colorsys.rgb_to_hsv 
    # r,g,b should be a numpy arrays with values between 0 and 255 
    # rgb_to_hsv returns an array of floats between 0.0 and 1.0. 
    rgb = rgb.astype('float') 
    hsv = np.zeros_like(rgb) 
    # in case an RGBA array was passed, just copy the A channel 
    hsv[..., 3:] = rgb[..., 3:] 
    r, g, b = rgb[..., 0], rgb[..., 1], rgb[..., 2] 
    maxc = np.max(rgb[..., :3], axis=-1) 
    minc = np.min(rgb[..., :3], axis=-1) 
    hsv[..., 2] = maxc 
    mask = maxc != minc 
    hsv[mask, 1] = (maxc - minc)[mask]/maxc[mask] 
    rc = np.zeros_like(r) 
    gc = np.zeros_like(g) 
    bc = np.zeros_like(b) 
    rc[mask] = (maxc - r)[mask]/(maxc - minc)[mask] 
    gc[mask] = (maxc - g)[mask]/(maxc - minc)[mask] 
    bc[mask] = (maxc - b)[mask]/(maxc - minc)[mask] 
    hsv[..., 0] = np.select(
     [r == maxc, g == maxc], [bc - gc, 2.0 + rc - bc], default=4.0 + gc - rc) 
    hsv[..., 0] = (hsv[..., 0]/6.0) % 1.0 
    return hsv 

def hsv_to_rgb(hsv): 
    # Translated from source of colorsys.hsv_to_rgb 
    # h,s should be a numpy arrays with values between 0.0 and 1.0 
    # v should be a numpy array with values between 0.0 and 255.0 
    # hsv_to_rgb returns an array of uints between 0 and 255. 
    rgb = np.empty_like(hsv) 
    rgb[..., 3:] = hsv[..., 3:] 
    h, s, v = hsv[..., 0], hsv[..., 1], hsv[..., 2] 
    i = (h * 6.0).astype('uint8') 
    f = (h * 6.0) - i 
    p = v * (1.0 - s) 
    q = v * (1.0 - s * f) 
    t = v * (1.0 - s * (1.0 - f)) 
    i = i % 6 
    conditions = [s == 0.0, i == 1, i == 2, i == 3, i == 4, i == 5] 
    rgb[..., 0] = np.select(conditions, [v, q, p, p, t, v], default=v) 
    rgb[..., 1] = np.select(conditions, [v, v, v, q, p, p], default=t) 
    rgb[..., 2] = np.select(conditions, [v, p, t, v, v, q], default=p) 
    return rgb.astype('uint8') 

Возможно, кто-то найдет решение моей проблемы?

ответ

0

Зачем внедрять свой собственный код преобразования цвета, если это доступно в Python, в библиотеке colorsys? См. here для получения дополнительной информации.

>>> import colorsys 
>>> colorsys.rgb_to_hsv(0.2, 0.4, 0.4) 
(0.5, 0.5, 0.4) 
>>> colorsys.hsv_to_rgb(0.5, 0.5, 0.4) 
(0.2, 0.4, 0.4) 
+0

Мне нужно, чтобы он был школьным проектом, поэтому мне не разрешено использовать существующие библиотеки .... глупо, я знаю ;-) – user2550641

 Смежные вопросы

  • Нет связанных вопросов^_^