gpt4 book ai didi

python - 归一化图像返回 --->OverflowError : cannot convert float infinity to integer

转载 作者:行者123 更新时间:2023-12-02 16:50:43 25 4
gpt4 key购买 nike

下面是我编写的 Python 代码,用于规范化图像并使其具有照度不变性。
对于图像的每个像素,新的像素值应为 (R/sum,G/sum,B/sum) , 其中 sum=R+G+B .

import numpy as np
import cv2


img=cv2.imread(r'C:/Users/kjbaili/.spyder-py3/color_supression_RV/rub00.jpg')


print(img[200,200])
print(img[200,200,0])

def normalized(down):

norm_img = np.zeros(down.shape, down.dtype)


width,height,channels=down.shape

for y in range(0,height):
for x in range(0,width):
sum=down[x,y,0]+down[x,y,1]+down[x,y,2]

b=(down[x,y,0]/ sum)*255
g=(down[x,y,1]/ sum)*255
r=(down[x,y,2]/ sum)*255


norm_img[x,y,0]= b
norm_img[x,y,1]= g
norm_img[x,y,2]= r

return norm_img


image=normalized(img)


cv2.imshow('normalized',image)


cv2.waitKey(0)
cv2.destroyAllWindows()
但是,我收到以下错误:
OverflowError: cannot convert float infinity to integer
虽然,我在这里找到了与此相关的类似已回答问题,但我无法将其转换到我的问题上,因为我不知道哪个值会导致无穷大。
很高兴得到一些帮助
提前致谢

最佳答案

您的访问索引已切换。你应该这样做 down[y,x,0]等等不是down[x,y,0] .但是,我怀疑您在访问这里时没有遇到任何错误,因为图像是方形的。此外,当您将三个数字相加时,与全浮点精度相比,精度有限,您的值将溢出。例如,添加 200 + 100 + 50在无符号 8 位整数中将导致 350 % 256 = 94 .无穷大结果中可能发生的情况是,要么你有完全黑色的像素,所以归一化导致除以 0 错误,或者三个值的总和溢出给你一个 0 值,再次给你这个结果。
您可以做的是执行完整性检查以确保如果三个 channel 的总和不等于 0,则执行标准化。此外,您需要更改精度,以便在求和后可以处理更高的值。
换句话说:

def normalized(down):

norm_img = np.zeros(down.shape, down.dtype)


width,height,channels=down.shape

for y in range(0,height):
for x in range(0,width):
sum=float(down[y,x,0])+float(down[y,x,1])+float(down[y,x,2]) # Change

if sum > 0: # Change
b=(down[y,x,0]/ sum)*255.0 # Change
g=(down[y,x,1]/ sum)*255.0
r=(down[y,x,2]/ sum)*255.0

norm_img[y,x,0]= b # Should cast downwards automatically
norm_img[y,x,1]= g
norm_img[y,x,2]= r

return norm_img
这当然是非常低效的,因为您正在循环单个像素并且没有利用体现 NumPy 数组的矢量化。简单地说,使用 numpy.sum 并沿第三维求和,然后将每个 channel 除以相应的数量:
def normalized(down):
sum_img = np.sum(down.astype(np.float), axis=2)
sum_img[sum_img == 0] = 1
return (255 * (down.astype(np.float) / sum_img[...,None])).astype(down.dtype)
第一行计算一个二维数组,其中每个位置沿 channel 维度求和,从而为您提供每个空间位置的 RGB 值的总和。我还将类型提升为浮点类型,以在规范化时保持精度。接下来,对第二行代码的中间检查确保没有除以零错误,因此任何为 0 的像素,我们将标记值设置为 1,以便除法得到 0 值。之后,我们获取输入图像并将每个相应的 RGB 像素除以相应空间位置的总和。请注意,我使用了广播,因此我已将 2D 和数组制作为具有单例第三 channel 的 3D 数组,以允许广播正常工作。最后,我乘以 255,就像您在以前的版本中所做的那样。我还确保将最终结果转换为函数中的传入类型。
为了更简洁,您可以使用 keepdims 来简化它。 numpy.sum 的论点在第三个维度求和后保持单例维度。这样就避免了手动单例维度插入:
def normalized(down):
sum_img = np.sum(down.astype(np.float), axis=2, keepdims=True)
sum_img[sum_img == 0] = 1
return (255 * (down.astype(np.float) / sum_img)).astype(down.dtype)

关于python - 归一化图像返回 --->OverflowError : cannot convert float infinity to integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62781371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com