gpt4 book ai didi

python - numpy 溢出

转载 作者:太空宇宙 更新时间:2023-11-03 15:17:24 26 4
gpt4 key购买 nike

我正在实现 Harris 角点检测并出现溢出错误:

harris.py:27: RuntimeWarning: overflow encountered in ubyte_scalars
Mat[0][1]=Ix[i][j]*Iy[i][j]
harris.py:28: RuntimeWarning: overflow encountered in ubyte_scalars
Mat[1][0]=Ix[i][j]*Iy[i][j]

这是完整的源代码。错误从何而来?由于 Ix.max 为 255,min 为 0。

import cv2
import numpy as np

im=cv2.imread('image.png', cv2.CV_LOAD_IMAGE_GRAYSCALE)

(M,N)=im.shape
print M
print N

Gx=np.array([[1, 0, -1],[ 2, 0, -2], [1, 0, -1]])
Gy=np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]])

Ix=cv2.filter2D(im, -1, Gx)
Iy=cv2.filter2D(im, -1, Gy)

print np.max(Ix)
print np.min(Ix)
print np.max(Iy)
print np.min(Iy)

Mat=np.zeros((2,2), dtype='float64')
R=np.zeros((M,N), dtype='float64')
for i in range(M):
for j in range(N):
Mat[0][0]=Ix[i][j]**2
Mat[0][1]=Ix[i][j]*Iy[i][j]
Mat[1][0]=Ix[i][j]*Iy[i][j]
Mat[1][1]=Iy[i][j]**2

R[i][j]=np.linalg.det(Mat)-(np.matrix.trace(Mat))**2


cv2.imshow("Ix",Ix)
cv2.imshow("Iy",Iy)
cv2.imshow("R",R)
cv2.waitKey(0)

最佳答案

发生的事情是您的输入数据是 uint8。因为您将两个 uint8 相乘,所以结果是一个 uint8,即使当您将它分配给 float 组 中的项目时它会被向上转换垫子.

举个例子:

In [1]: import numpy as np

In [2]: np.uint8(255) * np.uint8(255)
./anaconda/bin/ipython:1: RuntimeWarning: overflow encountered in ubyte_scalars
Out[2]: 1

请注意,numpy 会很乐意返回结果 (1),但如果您不熟悉有限精度整数,这可能不是您所期望的结果。

较新版本的 numpy 会引发运行时警告,而较旧版本则允许它静默发生。

这是故意的行为。在处理大型数组时,它非常很有用。您只需要知道,在涉及精度有限的数据类型时,numpy 的行为类似于 C。

您有多种选择。

  1. 将整个输入数组转换为 float (例如 Ix, Iy = Ix.astype(float), Iy.astype(float)
  2. Ix[i][j]Iy[i][j] 转换为循环内的 float 。

关于python - numpy 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19865974/

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