Jython 将图片转换为灰度然后取反

3 python jython grayscale invert jes

请耐心等待,我几周前才开始使用 python。

我正在使用 JES。

我做了一个将图片转换为灰度的函数。我为每种颜色 r 和 r1、g 和 g1、b 和 b1 创建了两个名称。这背后的想法是将原始值保留在内存中,以便图片可以恢复为其原始颜色。

def grayScale(pic):
  for p in getPixels(pic):
    r = int(getRed(p))
    g = int(getGreen(p))
    b = int(getBlue(p))//I have tried this with and without the int()
    r1=r
    g1=g
    b1=b
    new = (r + g + b)/3
    color= makeColor(new,new,new)
    setColor(p, color)


def restoreColor(pic):
  for p in getPixels(pic):
    setColor (p, makeColor(r1,g1,b1))
Run Code Online (Sandbox Code Playgroud)

它不起作用。 The error: "local or global name could not be found."

我明白为什么我会收到这个错误。

但是,如果我尝试在 restoreColor 中定义它们,它将给出灰度值。

我明白为什么我会收到这个错误,但不知道如何格式化我的代码,以保存名称值。我查看了有关局部和全局变量/名称的问题;但我无法在我学到的基本语法中弄清楚如何做到这一点。

问题是:

如何创建名称并获取原始(红色、绿色、蓝色)的值,然后我可以在另一个函数中使用它们?我尝试过的一切都返回了更改后的(灰度)值。谢谢

Gau*_*lio 5

只是补充一个“艺术”的观点:

您在程序中使用(r + g + b) / 3,但还有其他算法:

1)lightness method平均值最突出和至少突出颜色:

(max(R, G, B) + min(R, G, B)) / 2
Run Code Online (Sandbox Code Playgroud)

2)average method(你的)简单地平均化的值:

(R + G + B) / 3
Run Code Online (Sandbox Code Playgroud)

3)luminosity method是平均方法的更复杂版本。它还对这些值求平均值,但它会形成一个加权平均值来考虑人类感知。与其他颜色相比,我们对绿色更敏感,因此绿色的权重最大。光度公式为:

0.21 R + 0.71 G + 0.07 B
Run Code Online (Sandbox Code Playgroud)


这可以产生很大的不同(亮度的对比要大得多):

      original           |         average          |         luminosity 
Run Code Online (Sandbox Code Playgroud)

......在此处输入图片说明………………在此处输入图片说明……………………在此处输入图片说明…………


代码 :

px = getPixels(pic)
level = int(0.21 * getRed(px) + 0.71 * getGreen(px) + 0.07 * getBlue(px))
color = makeColor(level, level, level)
Run Code Online (Sandbox Code Playgroud)

要否定/反转,只需执行以下操作:

level = 255 - level
Run Code Online (Sandbox Code Playgroud)

其中给出:

def greyScaleAndNegate(pic):  

   for px in getPixels(pic):
      level = 255 - int(0.21*getRed(px) + 0.71*getGreen(px) +0.07*getBlue(px))
      color = makeColor(level, level, level)
      setColor(px, color)


file = pickAFile()
picture = makePicture(file) 
greyScaleAndNegate(picture)
show(picture)
Run Code Online (Sandbox Code Playgroud)
      original          |         luminosity        |           negative
Run Code Online (Sandbox Code Playgroud)

…………在此处输入图片说明……………………在此处输入图片说明…………………………………………………………………………………………………………………………………………在此处输入图片说明…………