详细列出暗通道估计,大气光照估计,透射率估计图像恢复这几个模块的公式
时间: 2024-06-04 15:07:51 浏览: 14
1. 暗通道估计:
暗通道是指在一张图像中,每个像素点在所有路径上至少有一个通道的值非常低。暗通道估计可以用来估计场景中的大气散射和透射率等信息。
公式:$J^{dark}(x) = \min_{c\in\{r,g,b\}}(I_c(x))$
其中,$I_c(x)$表示像素点$x$处颜色通道$c$的值,$J^{dark}(x)$表示像素点$x$处的暗通道值。
2. 大气光照估计:
大气光照估计可以用来估计场景中的大气光照强度,以便更准确地估计透射率。
公式:$A = \max_{x\in\Omega}(I(x))$
其中,$\Omega$表示图像中的一个小区域,$I(x)$表示像素点$x$处的亮度值,$A$表示图像中的大气光照强度。
3. 透射率估计:
透射率估计可以用来估计场景中存在的雾或者烟等因素对图像的影响程度。
公式:$t(x) = 1 - w\min_{y\in S(x)}(\frac{J^{dark}(y)}{A})$
其中,$S(x)$表示与像素点$x$相邻的一些像素点,$w$为一个常数,$J^{dark}(y)$表示像素点$y$处的暗通道值,$A$表示大气光照强度,$t(x)$表示像素点$x$处的透射率。
相关问题
编写程序,实现基于暗通道先验的大气透射率估计图,并采用软抠图法和引导滤波法得到精细化大气透射率图
以下是基于Python语言的程序实现:
```
import cv2
import numpy as np
# 全局大气光照A的估计值
def get_A(img, w=0.95):
# 获取亮度值最大的0.1%像素点
h, w, _ = img.shape
n = int(h * w * 0.001)
bright_pixels = np.argpartition(-cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).ravel(), n)[:n]
A = np.mean(img.reshape((-1, 3))[bright_pixels], axis=0)
return A
# 获取暗通道图像
def get_dark_channel(img, ksize=15):
min_img = cv2.erode(img, np.ones((ksize, ksize)))
return np.min(min_img, axis=2)
# 估计大气透射率t
def get_transmission(img, A, w=0.95, ksize=15):
I_dark = get_dark_channel(img, ksize)
t = 1 - w * A / I_dark
return t
# 软抠图法得到精细化大气透射率图
def soft_matting(I, t, eps=10**-7, win_size=3):
h, w = t.shape
t = cv2.copyMakeBorder(t, win_size, win_size, win_size, win_size, cv2.BORDER_REPLICATE)
I = cv2.copyMakeBorder(I, win_size, win_size, win_size, win_size, cv2.BORDER_REPLICATE)
t_mat = np.zeros((h*w, h*w))
for i in range(win_size, h+win_size):
for j in range(win_size, w+win_size):
cur_win = t[i-win_size:i+win_size+1, j-win_size:j+win_size+1]
cur_win = cur_win.reshape(-1)
cur_win = cur_win - np.mean(cur_win)
cur_win = cur_win / (np.linalg.norm(cur_win) + eps)
cur_I = I[i-win_size:i+win_size+1, j-win_size:j+win_size+1]
cur_I = cur_I.reshape((-1, 3))
cur_I = cur_I - np.mean(cur_I, axis=0)
cur_I = np.dot(cur_I.T, np.diag(cur_win)).dot(cur_I)
t_mat[(i-win_size)*w+j-win_size][(i-win_size)*w+j-win_size] = 1
for ii in range(2*win_size+1):
for jj in range(2*win_size+1):
if ii == win_size and jj == win_size:
continue
t_mat[(i-win_size)*w+j-win-size][(i-win_size+ii)*w+j-win_size+jj] = cur_win[ii*(2*win_size+1)+jj]
t_fine = np.linalg.solve(np.eye(h*w)-10**-4*t_mat, t.reshape(-1)).reshape((h, w))
return t_fine
# 引导滤波法得到精细化大气透射率图
def guided_filter(I, p, r=40, eps=10**-7):
mean_I = cv2.boxFilter(I, -1, (r, r))
mean_p = cv2.boxFilter(p, -1, (r, r))
corr_I = cv2.boxFilter(I*I, -1, (r, r))
corr_Ip = cv2.boxFilter(I*p, -1, (r, r))
var_I = corr_I - mean_I * mean_I
cov_Ip = corr_Ip - mean_I * mean_p
a = cov_Ip / (var_I + eps)
b = mean_p - a * mean_I
mean_a = cv2.boxFilter(a, -1, (r, r))
mean_b = cv2.boxFilter(b, -1, (r, r))
q = mean_a * I + mean_b
return q
# 加载图像
img = cv2.imread("input.jpg")
# 估计全局大气光照A
A = get_A(img)
# 估计大气透射率t
t = get_transmission(img, A)
# 软抠图法得到精细化大气透射率图
t_soft = soft_matting(img, t)
# 引导滤波法得到精细化大气透射率图
t_guide = guided_filter(img.astype(np.float32)/255, t_soft.astype(np.float32))
# 显示结果
cv2.imshow("Original Image", img)
cv2.imshow("Transmission Map", t)
cv2.imshow("Soft Matting Transmission Map", t_soft)
cv2.imshow("Guided Filter Transmission Map", t_guide)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
需要提前安装OpenCV库。程序实现了基于暗通道先验的大气透射率估计图,并采用了软抠图法和引导滤波法得到精细化大气透射率图。其中,软抠图法用于进一步减小估计误差,引导滤波法用于提高精度。
程序执行时,需要将实际图像的路径作为参数传入,程序会显示原图像、估计出的大气透射率图、软抠图法得到的精细化大气透射率图和引导滤波法得到的精细化大气透射率图。
基于Retinex的MSR算法求解估计光照分量的计算公式 python代码
Retinex算法是一种用于图像增强和色彩恢复的经典算法。其中的MSR算法(Multi-Scale Retinex)可以求解估计光照分量。下面是基于Retinex的MSR算法求解估计光照分量的计算公式以及Python代码实现:
公式:
$\log S(x,y) = \log I(x,y) - \log R(x,y)$
$R(x,y) = \exp(\frac{1}{N} \sum_{i=1}^N \log I(x,y) * G_i(x,y))$
其中,$I(x,y)$为原始图像,$S(x,y)$为增强后的图像,$R(x,y)$为估计的光照分量,$G_i(x,y)$为不同尺度的高斯滤波器。
Python代码实现:
```python
import cv2
import numpy as np
def MSR(img, scales):
# 将图像转化为float类型
img = np.float32(img)
# 初始化R(x,y)
R = np.zeros_like(img)
# 高斯滤波器的尺度
sigmas = [15, 80, 250]
N = len(sigmas)
# 计算R(x,y)
for i in range(N):
# 高斯滤波
img_smooth = cv2.GaussianBlur(img, (0, 0), sigmas[i])
# 计算log I(x,y)
log_I = np.log(img) - np.log(img_smooth)
# 计算G(x,y)
G = np.exp(-np.power(log_I, 2) / (2 * scales[i] * scales[i]))
# 计算R(x,y)
R += G * log_I
R /= N
# 计算S(x,y)
S = np.exp(np.log(img) - R)
# 将图像转化为uint8类型
S = np.uint8(np.clip(S, 0, 255))
return S
```
其中,参数`scales`为不同尺度的高斯滤波器的标准差。