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.isnannp.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) 变为 仅接近 无限而不是 实际 无限.