- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是我编写的 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/
我刚开始学习用 Python 编写代码。我正在尝试编写一些代码来回答这个欧拉项目问题: 13195 的质因数是 5、7、13 和 29。 数 600851475143 的最大质因数是多少? 我的程序适
根据python文档 exception OverflowError Raised when the result of an arithmetic operation is too larg
当我尝试这个计算时,我得到一个溢出错误,但我不知道为什么。 1-math.exp(-4*1000000*-0.0641515994108) 最佳答案 您要求 math.exp 计算的数字(十进制)超过
最后一天,解决另一个Project Euler我在管理 big for i in range(n) 循环时遇到了麻烦。 我观察到 python 会抛出不同的错误,取决于 x 变量有多大。 这是一个mc
我有一个返回 log10 值的函数。在将它们转换为正常数字时,出现溢出错误。 OverflowError: (34, 'Numerical result out of range') 我检查了日志值,
我正在使用 cartopy 绘制一些 map 。在某些情况下,在我的轴上调用 .set_extent() 时,出现此错误: Traceback (most recent call last): F
我正在尝试使用 pygame 在 Python 中创建一个简单的多人游戏和 socket模块。它只是由两个圆圈组成,由两台不同计算机的 W、A、S、D 键控制。 起初我用 recv() 创建了一个客户
我想模拟一个 OverflowError 因为我想在引发异常之后测试变量的值。但是,我不知道如何使用我正在使用的库复制 OverflowError。我在此特定测试中使用的库是 pysolar.sola
尝试在您的 Python 3.3.2 IDLE 中输入这个,希望我不是唯一想知道并且愿意理解为什么会发生这种情况的人。 >>> n = 331 >>> d = 165.0 # float number
我是 Python 的新手,我遇到了这个问题: 追溯(最近的调用最后): b = 1-exp(n)*erfc(n**0.5) OverflowError:数学范围错误 我需要为不断增加的“n”值计算“
我为一个板设置了一个简单的 MDP,它有 4 种可能的状态和 4 种可能的操作。棋盘和奖励设置如下: 这里,S4 是目标状态,S2 是吸收状态。我在编写的代码中定义了转移概率矩阵和奖励矩阵,以获得该
我正在尝试将大小为 n 位的 int 转换为字节。这将返回溢出错误 尝试将 int 转换为字节以便稍后通过 TCP 使用 def diffie_hellman(): global a,g,n
x=float(raw_input('Enter a number to show its square root')) precise = 0.01 g=x/2.0 while abs(g**2-x
我想找出这里的模式: >>> 1e300 ** 2 OverflowError: (34, 'Result too large') >>> 1e300j ** 2 OverflowError: com
对于一项作业,我们被要求创建一个返回反函数的函数。基本问题是从平方函数创建平方根函数。我想出了一个使用二进制搜索的解决方案和另一个使用牛顿法的解决方案。我的解决方案似乎适用于立方根和平方根,但不适用于
在发这个问题之前,我检查了所有可能重复的问题,尝试了所有的方法仍然无法解决问题。 我在 matplotlib 中有一个简单的绘图。当我注释掉调用 plt.fill_between() 的行时,代码可以
我想写一个函数来计算 (1/n!) * (1! + 2! + 3! + ... + n!) ,其中 n 作为函数的参数,结果也被截断为6 位小数(不四舍五入)。下面是我的代码: def going(n
我正在尝试通过以下代码行在 64 位 Windows 系统上的 Python 2.7 中生成随机数: random_state=numpy_rng.random_integers(1e10) 但我收到
我正在尝试序列化一个大型 python 对象,该对象由使用 pickle/cPickle 和 gzip 的 numpy 数组元组组成。该过程适用于特定大小的数据,之后我收到以下错误: --> 121
我想做什么 我正在使用 PyArrow读取一些 CSV 并将它们转换为 Parquet。我阅读的一些文件有很多列并且占用大量内存(足以使运行该作业的机器崩溃),因此我正在分块读取文件。 这就是我用来生
我是一名优秀的程序员,十分优秀!