Python中异常的程序流和变量修改
我试图修复我的阈值功能,因为它似乎没有正常工作。当我遇到一个奇怪的现象时,我真的觉得Python/编程中有些东西我真的不懂。 ` 这是错误的代码,我试图并排比较阈值函数Python中异常的程序流和变量修改,python,matplotlib,sequential,Python,Matplotlib,Sequential,我试图修复我的阈值功能,因为它似乎没有正常工作。当我遇到一个奇怪的现象时,我真的觉得Python/编程中有些东西我真的不懂。 ` 这是错误的代码,我试图并排比较阈值函数tresh()对我正在处理的图像的影响 下面显示的两幅图像是相同的,即使阈值函数仅应用于显示的一个变量,即c。变量b在显示之前不会进行任何修改,但它的显示方式与已设置阈值的c相同 我试图通过在imshow()函数中隐式执行阈值来修复它,但令我惊讶的是,它居然成功了 我想不出一种方法来解释为什么原始代码片段会生成相同的图像,为什
tresh()
对我正在处理的图像的影响
下面显示的两幅图像是相同的,即使阈值函数仅应用于显示的一个变量,即c。变量b
在显示之前不会进行任何修改,但它的显示方式与已设置阈值的c
相同
我试图通过在imshow()
函数中隐式执行阈值来修复它,但令我惊讶的是,它居然成功了
我想不出一种方法来解释为什么原始代码片段会生成相同的图像,为什么我的“修复程序”会生成两个不同的图像
阈值函数
def thresh(image):
x = len(image)
y = len(image[0])
tresh = 180
for ix in range(x):
for iy in range(y):
if image[ix][iy] <tresh:
image[ix][iy] = 0
return image
def thresh(图像):
x=透镜(图像)
y=len(图像[0])
tresh=180
对于范围(x)内的ix:
对于范围(y)内的iy:
如果image[ix][iy]您的问题是由以下两个事实造成的:Python通过赋值传递参数(在您的例子中,image
在函数中,b
和c
引用同一个对象),列表是可变对象(您可以根据对象的状态进行修改)
因此,当您在thresh
内部修改image
时,您正在修改底层对象,从而修改b
和c
为避免此问题,您需要将b
的副本传递给函数(有关实现此功能的不同方法的更多信息,请参见此)
在您的情况下,您需要将代码更改为:
from copy import deepcopy
b = deepcopy(c)
c = thresh(c)
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow((c),cmap='gray'),plt.title('C tresh')
plt.show()
另外请注意,在这种情况下,不需要在函数末尾返回image
什么是“thresh”功能?它来自哪里?您确定thresh
不会修改它的参数吗?如果执行b=c.copy();c=thresh(c)
?我添加了该功能@user8153我将尝试这样做实际上,它看起来像是您的thresh
函数直接修改其参数。它也没有提供返回值。有返回,我只是没有正确粘贴。谢谢。那么什么时候应该/不应该在python中使用return呢?这是一个巨大的问题。这纯粹是一个选项,但如果我创建了新值,我将返回它们。如果就地修改,则返回None。看见
def thresh(image):
x = len(image)
y = len(image[0])
tresh = 180
for ix in range(x):
for iy in range(y):
if image[ix][iy] <tresh:
image[ix][iy] = 0
return image
from copy import deepcopy
b = deepcopy(c)
c = thresh(c)
plt.subplot(121),plt.imshow(b,cmap='gray'),plt.title('C')
plt.subplot(122),plt.imshow((c),cmap='gray'),plt.title('C tresh')
plt.show()