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 中定义它们,它将给出灰度值。
我明白为什么我会收到这个错误,但不知道如何格式化我的代码,以保存名称值。我查看了有关局部和全局变量/名称的问题;但我无法在我学到的基本语法中弄清楚如何做到这一点。
问题是:
如何创建名称并获取原始(红色、绿色、蓝色)的值,然后我可以在另一个函数中使用它们?我尝试过的一切都返回了更改后的(灰度)值。谢谢
只是补充一个“艺术”的观点:
您在程序中使用(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)
…………
……………………
…………………………………………………………………………………………………………………………………………
…………