RuntimeWarning:在日志中除以零,在 true_divide 中遇到无效值
RuntimeWarning: divide by zero encountered in log and invalid value encountered in true_divide
我一直在尝试 运行 我在 GitHub 上找到的一些代码(如果我需要参考你从 Stack OverFlow 上的其他来源获得的代码,请告诉我)但我是遇到错误
"RuntimeWarning: divide by zero encountered in log and invalid value encountered in true_divide"
当像素值被读入可能包含零的矩阵时,您如何解决这个问题?此外,我附上了我正在使用的图像。
from __future__ import print_function
import numpy as np
import cv2
import os
def rgb2ii(img, alpha):
"""Convert RGB image to illumination invariant image."""
ii_image = (0.5 + np.log(img[:, :, 1] / float(255)) -
alpha * np.log(img[:, :, 2] / float(255)) -
(1 - alpha) * np.log(img[:, :, 0] / float(255)))
return ii_image
if __name__ == "__main__":
image = os.path.join("/Python/OpenCv/Images/MFB1.png")
source_img = cv2.imread(image, 1)
a = 0.333 # Camera alpha
invariant_img = rgb2ii(source_img, a)
invariant_img /= np.amax(invariant_img) # invariant_img = invariant_img / np.amax(invariant_img)
cv2.imshow("RGB Image", source_img)
cv2.imshow("Illumination Invariant", invariant_img)
cv2.waitKey()
拥抱 NaN。
Numpy有检测NaN和无穷大的函数,分别是np.isnan
和np.isinf
。您可以使用由这些产生的掩码 select 并在它们发生后擦除 NaN/infinity 值。
calculation = np.log([-1, 0, 1]) # -> [nan, -inf, 0]
infmask = np.isinf(calculation)
nanmask = np.isnan(calculation)
calculation[infmask] = 9999
calculation[nanmask] = 12345
或者更改数学,使其不会首先发生。典型的技巧是在你的情况下添加一个小的“epsilon”到对数的参数,这使得它在所有情况下都是positive/non-zero(假设它之前> = 0)并且与“相比”足够小常规”值,以免对结果产生太大影响...导致 log(0+epsilon)
变为 仅接近 无限而不是 实际 无限.
我一直在尝试 运行 我在 GitHub 上找到的一些代码(如果我需要参考你从 Stack OverFlow 上的其他来源获得的代码,请告诉我)但我是遇到错误
"RuntimeWarning: divide by zero encountered in log and invalid value encountered in true_divide"
当像素值被读入可能包含零的矩阵时,您如何解决这个问题?此外,我附上了我正在使用的图像。
from __future__ import print_function
import numpy as np
import cv2
import os
def rgb2ii(img, alpha):
"""Convert RGB image to illumination invariant image."""
ii_image = (0.5 + np.log(img[:, :, 1] / float(255)) -
alpha * np.log(img[:, :, 2] / float(255)) -
(1 - alpha) * np.log(img[:, :, 0] / float(255)))
return ii_image
if __name__ == "__main__":
image = os.path.join("/Python/OpenCv/Images/MFB1.png")
source_img = cv2.imread(image, 1)
a = 0.333 # Camera alpha
invariant_img = rgb2ii(source_img, a)
invariant_img /= np.amax(invariant_img) # invariant_img = invariant_img / np.amax(invariant_img)
cv2.imshow("RGB Image", source_img)
cv2.imshow("Illumination Invariant", invariant_img)
cv2.waitKey()
拥抱 NaN。
Numpy有检测NaN和无穷大的函数,分别是np.isnan
和np.isinf
。您可以使用由这些产生的掩码 select 并在它们发生后擦除 NaN/infinity 值。
calculation = np.log([-1, 0, 1]) # -> [nan, -inf, 0]
infmask = np.isinf(calculation)
nanmask = np.isnan(calculation)
calculation[infmask] = 9999
calculation[nanmask] = 12345
或者更改数学,使其不会首先发生。典型的技巧是在你的情况下添加一个小的“epsilon”到对数的参数,这使得它在所有情况下都是positive/non-zero(假设它之前> = 0)并且与“相比”足够小常规”值,以免对结果产生太大影响...导致 log(0+epsilon)
变为 仅接近 无限而不是 实际 无限.