关于Python中函数作为参数的问题

hrcnpc 2012-10-14 10:33:52
最近在看关于Python关于图像处理方面的内容,我用的是PIL库(Python Image Library)。
在做灰度变换时,我用了Image类的eval函数,这个函数要求传入一个Image对象和一个function,其中function要带一个参数,eval可以将这个function用于计算所有的像素点。现在问题来了,比如我要做一个对数变换,用一个s = c * math.log(1 + r, base)这样的函数(其中r代表灰度值),我必须在函数内部定义好c和base的值,再把函数传递给eval才能正确运行。
如果我想将这个函数定义为带3个参数,第一个用于像素点操作,其它两个用于控制c和base,我该怎么进行传递?(我尝试了用foo(p,c=1,base=10)这样的传递方式,但输入后shell报错)希望各位牛人能帮帮我啊!!
...全文
329 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrcnpc 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

输入后shell报错?
什么错?
[/Quote]
你好,我的代码是这样的:

def log(r,c = 1, base = 2):
return int(c * math.log(r+1, base))
out = Image.eval(im,log)

这样可以正常使用,其中out和im都是一个Image对象。但是当我想指定c和base的值时,若输入:

out = Image.eval(im,log(c = 0.5, base = 10))

则提示:
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
out = Image.eval(im,log(c = 0.5, base = 10))
TypeError: log() takes at least 1 argument (2 given)

若输入:

out = Image.eval(im, log(r,c = 0.5, base = 10))

则提示:
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
out = Image.eval(im, log(r,c = 0.5, base = 10))
NameError: name 'r' is not defined

我该怎样才能指定其它两个参数,而保留一个参数让eval()函数进行计算?请指教。
angel_su 2012-10-15
  • 打赏
  • 举报
回复
约定好1个参数的函数,不能改成3个吧,不过你可以动态生成一个函数,类似:
import math

def foo(c=1, base=10):
def bar(x):
res= c * math.log(x, base)
print '%d x log%d(%d) = %g' % (c, base, x, res)

return bar

f1 = foo()
f2 = foo(2, 5)

f1(100)
f2(25)


结果:
1 x log10(100) = 2
2 x log5(25) = 4
hrcnpc 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

奇怪你为什么要用eval(),这是用来得到一个表达式的值的
有了PIL,可以将整个图像读入,你定义好变换函数,将像素值直接传递给函数即可
[/Quote]
你好,请问你的意思是使用Image类的getpixel方法得到像素值或元组再操作吗?这样的话怎样把操作好的值或元组再赋回给原图像?
我看文档里eval方法是将自定义函数传入方法中,对每一个像素值都应用一次函数,然后可以直接返回一个新的图像。这样不是更快捷吗?请指教。
hrcnpc 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

约定好1个参数的函数,不能改成3个吧,不过你可以动态生成一个函数,类似:
Python code
import math

def foo(c=1, base=10):
def bar(x):
res= c * math.log(x, base)
print '%d x log%d(%d) = %g' % (c, base, x, res)
……
[/Quote]
成功了!非常感谢!!!也感谢其它为我解答的朋友,可以结贴了。
hrcnpc 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

out = Image.eval(im,log)

改为:
c,base = 1,2
out = Image.eval(im, int(c * math.log(r+1, base)))

需要事先定义下c和base还有r,当然,也可以一样当作默认参数传进父方法
[/Quote]
呃,用内联函数也不用在这讨论了,太不方便了……
amu9900 2012-10-15
  • 打赏
  • 举报
回复
out = Image.eval(im,log)

改为:
c,base = 1,2
out = Image.eval(im, int(c * math.log(r+1, base)))

需要事先定义下c和base还有r,当然,也可以一样当作默认参数传进父方法
Gloveing 2012-10-14
  • 打赏
  • 举报
回复
输入后shell报错?
什么错?
libralibra 2012-10-14
  • 打赏
  • 举报
回复
奇怪你为什么要用eval(),这是用来得到一个表达式的值的
有了PIL,可以将整个图像读入,你定义好变换函数,将像素值直接传递给函数即可

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧