Как настроить все изображение с помощью jython

def whiteBalance():
 myFile = pickAFile()
 print myFile
 myPicture = makePicture(myFile)
 print myPicture
 explore(myPicture)
 xRef = requestInteger("Enter the X Value of the Reference Point")
 yRef = requestInteger("Enter the Y value of the Reference Point")
   for p in getPixels(myPicture):
     average = (getRed(p)+getGreen(p)+getBlue(p))/3
     setColor(p,makeColor(average,average,average))
       for px in getPixels(myPicture):
          newRed = getRed(px) * 0.9
          newGreen = getGreen(px) * 0.944
          newBlue = getBlue(px) * 1.20

          explore(myPicture)

Выше мой код! Я пытаюсь сделать изображение и сделать его белее с помощью whiteBalance().

Вот мои планы

Расчет значения серого в опорной точке. Значение серого пикселя представляет собой среднее значение его красного, зеленого и синего значений. Например, в примере значения RGB опорной точки на этом этапе будут 151, 161 и 137. Следовательно, значение серого должно быть 149,66...

Расчет поправочных коэффициентов R, G, B. Мы хотим, чтобы значения RGB опорной точки были преобразованы в значение серого, рассчитанное выше. Для этого делим значение серого на отдельные значения красного, зеленого, синего в контрольной точке и получаем поправочный коэффициент.

Так вот сценарий, после этого изображение будет отображаться ярче, что я могу сделать, этот текущий код дает сбои и заставляет окна всплывать 100 раз, буквально!

Заранее спасибо!


person Josh Gomez    schedule 25.03.2016    source источник


Ответы (4)


Итак, в вашем коде вы запрашиваете x и y, но не используете их для вычисления значения серого? Кроме того, откуда берутся эти цифры? (тот, который вы используете для создания новых красных, зеленых и синих значений?)

Я объясню каждый шаг, но не просто копируйте код, попытайтесь понять его и написать заново. Так люди учатся программировать. Удачи!

Используйте это, чтобы выбрать файл, сделать его своим изображением и отобразить его для сравнения позже.

def whiteBalance():
 file = pickAFile()
 pic = makePicture(file)
 explore(pic)

Затем попросите пользователя указать точку отсчета на вашей картинке.

x = requestInteger ("Please specify X-coordinate")
y = requestInteger ("Please specify Y-coordinate")

Затем получите значение RGB для этого конкретного пикселя, который только что дал вам пользователь.

pixel = getPixelAt(pic,x,y)

Извлеките значение R, G, B из этого пикселя, чтобы использовать его для расчета значения серого.

red = getRed(pixel)
green = getGreen(pixel)
blue = getBlue(pixel)
average = (red+green+blue)/3.00

Затем рассчитайте поправочные коэффициенты R, G, B.

redadj = average /red
greenadj = average /green
blueadj = average /blue

Теперь вы можете использовать цикл, чтобы применить изменения ко всему изображению.

for r in getPixels(pic):
  value = getRed(r)
  setRed(r, (value* redadj))

for g in getPixels(pic):
  value = getGreen(g)
  setGreen(g, (value* greenadj))

for b in getPixels(pic):
  value = getBlue(b)
  setBlue(b, (value* blueadj))

Теперь вы можете отобразить отредактированное изображение с помощью explore(pic). Просто обратите внимание на отступы, поэтому у вас появляется много всплывающих окон.

person Huy Tran    schedule 30.03.2016
comment
Спасибо, я сделал этот код, но, похоже, он просто загружается и не показывает изображения. - person Josh Gomez; 04.04.2016
comment
как сделать петли р, г, б в одну петлю? - person Josh Gomez; 12.04.2016
comment
Вы должны добавить исследовать или перерисовать в конце кода, чтобы показать изображение. - person Huy Tran; 14.04.2016

Кажется, я на том же задании, что и ты.

Ваша проблема в том, что команда explore() внизу находится внутри ваших циклов. Таким образом, каждый раз, когда он зацикливается, вы создаете другое изображение. Просто нужно вывести его, чтобы он выполнялся после завершения циклов.

person Jamie    schedule 26.03.2016

Вот полностью рабочий код:

def whiteBalance():
 file = pickAFile()
 pic = makePicture(file)
 explore(pic) #open original picture for comparison 

 #Pick a picture then ask for a pixel in the picture.

 x = requestInteger ("Please specify X-coordinate")
 y = requestInteger ("Please specify Y-coordinate")

 pixel = getPixelAt(pic,x,y)

 #Get the RGB value of the given pixel.

 red = getRed(pixel)
 green = getGreen(pixel)
 blue = getBlue(pixel)

 #The grey value of the pixel is the average of its red, green and blue values.

 average = (red+green+blue)/3.00

 #Calculation of R, G, B adjustment factors.

 redadj = average /red
 greenadj = average /green
 blueadj = average /blue

 #Adjustment of the entire image.

 for r in getPixels(pic):
  value = getRed(r)
  setRed(r, (value* redadj))

 for g in getPixels(pic):
  value = getGreen(g)
  setGreen(g, (value* greenadj))

 for b in getPixels(pic):
  value = getBlue(b)
  setBlue(b, (value* blueadj))

 #Display the edited image.

 explore(pic)

Есть много способов превратить петлю RGB в одну петлю, может быть, что-то вроде этого:

 for p in getPixels(pic):
  newRed = getRed(p)*redadj
  newBlue = getBlue(p)*blueadj
  newGreen = getGreen(p)*greenadj
  setRed(p,newRed)
  setGreen(p,newGreen)
  setBlue(p,newBlue)
person Huy Tran    schedule 14.04.2016
comment
Большое вам спасибо, вы очень помогли, только один последний вопрос, как бы я сделал ту же самую функцию, но попросил пользователя указать прямоугольную область? - person Josh Gomez; 15.04.2016

подумайте о прямоугольнике, используя верхний левый угол, равный x1 и y1, и нижний левый угол прямоугольника, равный x2 и y2, эти четыре точки должны быть в состоянии создать область для выбора, как вы уже сделали в своем коде для x и y

person user6352505    schedule 18.05.2016