Python Jython将图片转换为灰度,然后对其求反

Python Jython将图片转换为灰度,然后对其求反,python,jython,grayscale,invert,jes,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 wit

请容忍我,我几周前才开始使用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))
它不起作用了<代码>错误:“找不到本地或全局名称。”

我明白为什么我会犯这个错误

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

我理解为什么会出现此错误,但不知道如何格式化代码,以保存名称值。我研究了关于局部和全局变量/名称的问题;但在我所学的基本语法中,我无法找出如何做到这一点

问题是:


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

您需要为每个像素存储
r1
g1
b1
值-在
grayScale
函数中,值在循环的每次迭代中都会被写入,最后,当方法完成时,变量超出范围,根本无法访问。因此,如果你想以后使用它们,你需要以某种方式存储它们——对于原始图像的每个像素

处理这种情况的一种方法是保持原始图像的完整性,并将所有修改保存在新图像中

另一种方法是将原始数据存储在列表中:

original_pixels = []

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()
    original_pixels.append((r, g, b))
    new = (r + g + b)/3
    color= makeColor(new,new,new)
    setColor(p, color)


def restoreColor(pic):
  for (p, original_rgb) in zip(getPixels(pic), original_pixels):
    (r, g, b) = original_rgb
    setColor (p, makeColor(r,g,b))
这里在
grayScale
中,我们将原始rgb值存储在一个名为
original\u pixels
的列表中,然后在
restoreColor
中,我们使用Python的
zip
函数对
getPixels(pic)
original\u pixels
进行迭代


为了完整起见,我想指出,此代码不应用于在实际应用程序中操纵真实图像,而应使用专门的图像处理库。

函数体中声明的变量是局部变量,即它们仅存在于该函数中。要写入函数中的全局变量,必须首先声明它为:

r1 = 0

def grayScale(pic):
    for p in getPixels(pic):
        r = getRed(p)
        global r1
        r1 = r
代码的第二个问题是只保存图像最后一个像素的值,因为每次迭代都会覆盖以前存储的值。处理此问题的一种方法是使用颜色值列表

reds = []

def grayScale(pic):
    for p in getPixels(pic):
        r = getRed(p)
        reds.append(r)


def restoreColor(pic):
    i = 0
    for p in getPixels(pic):
        setColor(p, makeColor(reds[i]))
        i += 1

正如我在评论中所建议的,我将使用标准模块和:

这并不是实现您想要做的事情的最佳方法,但它是一种工作方法,最能反映您当前的代码

也就是说,使用PIL,将RGB图像转换为灰度级要简单得多,而不必在每个像素之间循环(例如,转换('L'))

,只需添加“艺术”视角即可:

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

1)明度法对最突出和最不突出的颜色进行平均:

(max(R, G, B) + min(R, G, B)) / 2
2)您的
平均法(average method
)只是对值进行平均:

(R + G + B) / 3
3)光度法是平均法的一个更复杂的版本。它也对值进行平均,但它形成了一个加权平均值,以解释人类感知。我们对绿色比其他颜色更敏感,所以绿色的分量最大。光度的公式为:

0.21 R + 0.71 G + 0.07 B

这会产生很大的不同(光度的对比度要高得多):


代码:

要否定/颠倒,只需执行以下操作:

level = 255 - level
其中给出:

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)

"

px = getPixels(pic)
level = int(0.21 * getRed(px) + 0.71 * getGreen(px) + 0.07 * getBlue(px))
color = makeColor(level, level, level)
level = 255 - level
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)
      original          |         luminosity        |           negative