如何使用 jython 调整整个图像

How do I adjust the Entire image using 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值转化为上面计算的灰度值。为此,我们将灰度值除以参考点的各个红、绿、蓝值,得到调整因子。

情况就是这样,之后图像会显示得更亮,我该怎么办,当前代码出现故障并使 windows 弹出 100 次,字面意思!

提前致谢!

我想我和你的任务是一样的。

你的问题是底部的 explore() 命令在你的循环中。所以每次循环你都会产生另一个图像。只需要把它拿出来,以便在循环完成后执行。

所以在你的代码中你要求 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) 显示您编辑过的图像。 请注意缩进,这就是为什么会弹出很多 windows。

这是完整的工作代码:

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)

想一个矩形,左上角为 x1 和 y1,矩形的左下角为 x2 和 y2 这四点应该能够像您在代码中已经为 x 和 y

一样创建一个可供选择的区域