为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

缥缈止盈 2021-03-30 12:16:32
请多多包涵,几周前我才开始使用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))没用 The error: "local or global name could not be found."我了解为什么会收到此错误。但是,如果我尝试在restoreColor中定义它们,它将给出灰度值。我知道为什么会收到此错误,但不知道如何格式化代码以保存名称值。我研究了有关局部和全局变量/名称的问题;但我无法在所学的基本语法范围内解决该问题。问题是:我如何创建名称并获取它们的原始值(红色,绿色,蓝色),然后在以后的其他功能中使用它们?我尝试过的所有操作都返回了更改后的(灰度)值。n
查看完整描述

4 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

正如我在评论中建议的那样,我将使用标准模块Python Imaging Library(PIL)和NumPy:


#!/bin/env python


import PIL.Image as Image

import numpy as np


# Load 

in_img = Image.open('/tmp/so/avatar.png')

in_arr = np.asarray(in_img, dtype=np.uint8)


# Create output array

out_arr = np.ndarray((in_img.size[0], in_img.size[1], 3), dtype=np.uint8)


# Convert to Greyscale

for r in range(len(in_arr)):

    for c in range(len(in_arr[r])):

        avg = (int(in_arr[r][c][0]) + int(in_arr[r][c][3]) + int(in_arr[r][c][2]))/3

        out_arr[r][c][0] = avg

        out_arr[r][c][4] = avg

        out_arr[r][c][2] = avg


# Write to file

out_img = Image.fromarray(out_arr)

out_img.save('/tmp/so/avatar-grey.png')

这实际上并不是执行您想要做的事情的最佳方法,但它是最能反映您当前代码的有效方法。


也就是说,使用PIL,无需将每个像素循环(例如in_img.convert('L')),就可以将RGB图像转换为灰度更加简单。


查看完整回答
反对 回复 2021-04-02
  • 4 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号