Как увеличить/уменьшить насыщенность цвета изображения с помощью Jython (JES)?

Я пытаюсь создать пару функций, которые будут увеличивать или уменьшать общую насыщенность цвета изображения. Я понимаю, что «насыщенность» по сути означает «дальше или ближе к серому», поэтому мне нужно либо увеличивать, либо уменьшать каналы RGB, но я не могу сделать их все одинаково (т.е. r * 2, g * 2, b * 2) так как это только делает изображение светлее.

Я пытался использовать приведенные здесь формулы: http://www.georeference.org/doc/colors_as_hue_saturation_and_brightness.htm, но когда я попытался использовать его в своем коде, изображение почти полностью черное с некоторыми желтыми пятнами.

Вот что я пробовал до сих пор:

def upSaturation(pictu):
   '''Takes a picture and increases the overall color saturation'''
   satuP = duplicatePicture(pictu)
   for pixel in getPixels(satuP):
   r = getRed(pixel)
   g = getGreen(pixel)
   b = getBlue(pixel)
   mn = min(r, g, b)
   mx = max(r, g, b)
   lht = (mx + mn) / 2
   if lht <= 128:
     satu = 255 * ((mx - mn) / (mx + mn))
     clr = makeColor(r * satu, g * satu, b * satu)
     setColor(pixel, clr)
   else:
     sat = 255 * ((mx - mn) / (511 - (mx + mn)))
     color = makeColor(r * sat, g * sat, b * sat)
     setColor(pixel, color)
 show(satuP)
 return satuP

Я также пробовал использовать makeColor(sat, sat, sat), но тот получился полностью черным с некоторыми белыми пятнами. Я не уверен, что еще делать в этот момент. Я был бы очень признателен за некоторые рекомендации.


person RMP    schedule 28.11.2014    source источник


Ответы (1)


Чтобы увеличить насыщенность, вы должны увеличить значение основного цвета. Если, например, пиксель в основном красный, вам нужно увеличить красное содержание пикселя и уменьшить остальное.

def upSaturation(pictu): 
'''Takes a picture and increases the overall color saturation'''
 satuP = duplicatePicture(pictu)
 for pixel in getPixels(satuP):
  r = getRed(pixel)
  g = getGreen(pixel)
  b = getBlue(pixel)
  # check if red is primary colour
  if r > g and r > b:
   # Saturate with red
   r = r + 5
   if g < b:
     g = g - 5
   else:
     b = b - 5

  # check if green is primary colour
  if g > r and g > b:
   # Saturate with green
   g = g + 5
   if r < b:
     r = r - 5
   else:
     b = b - 5

  # check if blue is primary colour
  if b > r and b > g:
   # Saturate with blue
   b = b + 5
   if r < g:
     r = r - 5
   else:
     g = g - 5

 color = makeColor(r, g, b)
 setColor(pixel, color)
 explore(satuP)
 return satuP
person super_mario3d    schedule 29.11.2014