上述代码在retinex_output+=img_log处报错:Cannot cast ufunc 'add' output from dtype('float64') to dtype('uint8') with casting rule 'same_kind'。怎么解决
时间: 2023-09-02 15:09:41 浏览: 123
这个错误是由于 `img_log` 是一个浮点型数组,而 `retinex_output` 是一个无符号 8 位整型数组,因此无法将 `img_log` 直接加到 `retinex_output` 中。解决方法是将 `retinex_output` 的数据类型改为浮点型数组,即:
```python
import cv2
import numpy as np
def retinex(img, sigma_list):
retinex_output = np.zeros_like(img, dtype=float)
img = np.float64(img)
for sigma in sigma_list:
img_blur = cv2.GaussianBlur(img, (0,0), sigma)
img_log = np.log10(img) - np.log10(img_blur)
retinex_output += img_log
retinex_output = retinex_output / len(sigma_list)
retinex_output = np.exp(retinex_output) * 255
retinex_output = np.uint8(retinex_output)
return retinex_output
# 读取图片
img = cv2.imread("dark_image.jpg")
# 设置 sigma 值列表
sigma_list = [15, 80, 250]
# 调用 Retinex 函数
output = retinex(img, sigma_list)
# 显示原图和增强后的图像
cv2.imshow("Original", img)
cv2.imshow("Retinex", output)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这个版本的代码中,我将 `retinex_output` 的数据类型改为了浮点型,并在 `np.exp(retinex_output) * 255` 之前进行了归一化操作,以便将像素值还原为整数范围内的值。
阅读全文