def singleScaleRetinex(img, sigma): retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma)) return retinex
时间: 2024-05-27 16:08:46 浏览: 113
这是一个实现单尺度Retinex算法的Python函数。单尺度Retinex算法是一种常见的图像增强方法,通过对图像进行对数变换和高斯模糊操作,可以调整图像的亮度和对比度。该函数接受两个参数,第一个参数img是输入图像,第二个参数sigma是高斯模糊的标准差。函数首先对输入图像进行对数变换,然后使用cv2.GaussianBlur函数对图像进行高斯模糊,最后将对数变换后的图像与高斯模糊后的图像相减得到Retinex增强后的图像。函数返回Retinex增强后的图像。
相关问题
怎么解决C:\Users\hp\venv\Scripts\python.exe "D:\BI she\pythonProject3\MSRCR.py" Traceback (most recent call last): File "D:\BI she\pythonProject3\MSRCR.py", line 31, in <module> img_retinex = retinex_with_color_restoration(img) File "D:\BI she\pythonProject3\MSRCR.py", line 20, in retinex_with_color_restoration img_retinex = np.uint8(np.clip((img_retinex * img_msb) / 255.0, 0, 255)) ValueError: operands could not be broadcast together with shapes (1080,1440,3) (1080,1440)
这个报错是因为 `img_retinex` 和 `img_msb` 的形状不匹配导致的。根据代码,可以发现 `img_msb` 是一个二维数组,而 `img_retinex` 是一个三维数组。在计算 `(img_retinex * img_msb) / 255.0` 时,两个数组的形状不匹配,因此会报错。
为了解决这个问题,可以将 `img_msb` 扩展为与 `img_retinex` 相同的形状,即在第三个维度上复制两次。具体方法如下:
```python
img_msb = np.expand_dims(img_msb, axis=2)
img_msb = np.tile(img_msb, [1, 1, 3])
```
将上述代码添加到 `retinex_with_color_restoration()` 函数中,在计算 `(img_retinex * img_msb) / 255.0` 之前,即可解决这个问题。
完整代码示例:
```python
import cv2
import numpy as np
def retinex_with_color_restoration(img, sigma_list=[15, 80, 250], G=5, b=25, alpha=125, beta=46, low_clip=0.01, high_clip=0.99):
img = np.float64(img) + 1.0
img_retinex = np.zeros_like(img)
for sigma in sigma_list:
img_retinex += np.log10(img) - np.log10(cv2.GaussianBlur(img, (G, G), sigma))
img_color = np.zeros_like(img)
for channel in range(3):
img_color[:, :, channel] = np.median(img[:, :, channel])
img_msb = np.max(img_color, axis=2)
img_msb = (cv2.GaussianBlur(img_msb, (b, b), sigma_list[0]) + alpha) * 255 / (beta + alpha)
img_msb = np.expand_dims(img_msb, axis=2)
img_msb = np.tile(img_msb, [1, 1, 3])
img_retinex = cv2.normalize(img_retinex, None, 0, 255, cv2.NORM_MINMAX)
img_retinex = np.uint8(np.clip((img_retinex * img_msb) / 255.0, 0, 255))
low_val, high_val = np.percentile(img_retinex, [low_clip * 100, high_clip * 100])
img_retinex = np.uint8(cv2.normalize(img_retinex, None, low_val, high_val, cv2.NORM_MINMAX))
return img_retinex
# 读取图像
img = cv2.imread('example.jpg')
# 进行带色彩恢复因子的Retinex算法亮度增强
img_retinex = retinex_with_color_restoration(img)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Retinex', img_retinex)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码示例中,`np.expand_dims()` 函数用于在第二个维度上添加一个长度为1的维度,将 `img_msb` 转换为二维数组,然后使用 `np.tile()` 函数将其复制两次,以匹配 `img_retinex` 的形状。
上述代码在retinex_output+=img_log处报错:Cannot cast ufunc 'add' output from dtype('float64') to dtype('uint8') with casting rule 'same_kind'。怎么解决
这个错误是由于 `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` 之前进行了归一化操作,以便将像素值还原为整数范围内的值。
阅读全文