为什么要对透射率图进行引导滤波
时间: 2023-11-08 21:04:02 浏览: 40
在图像去雾算法中,透射率图是非常重要的中间结果。透射率图反映了场景中每个像素的深度信息,可以用来去除雾霾并恢复出清晰的图像。但是,由于透射率图往往存在噪声,特别是在图像中存在纹理丰富的区域时,透射率图的噪声会对去雾效果造成不利影响。
引导滤波是一种基于图像局部相似性的滤波方法,它可以在保留图像边缘信息的同时去除图像中的噪声。因此,对透射率图进行引导滤波可以有效地去除透射率图中的噪声,提高去雾效果。此外,引导滤波还可以用来平滑透射率图,使得透射率图更加平滑自然。
相关问题
实现基于暗通道先验的大气透射率估计图,并采用软抠图法和引导滤波法得到精细化大气透射率图 matlab实现代码
以下是一个基于暗通道先验的大气透射率估计图的 Matlab 代码:
```matlab
function [t, A] = dark_channel(im, w)
% 计算暗通道图像和大气透射率
% im:输入图像
% w:窗口大小
[h, w, ~] = size(im);
n = h*w;
im_flat = reshape(im, n, 3); % 将图像转换为[n,3]的二维矩阵
% 计算每个像素的最小值,得到暗通道图像
dc = min(im_flat, [], 2);
dc = reshape(dc, h, w);
% 计算暗通道图像的平均值,得到全局大气光A
A = mean(reshape(im_flat(repmat(dc, [1 3]) == dc, :), [], 3));
% 计算大气透射率t
t = 1 - 0.95*dc/max(A) + 0.05;
t = min(max(t, 0), 1);
% 用引导滤波和软抠图对t进行精细化处理
r = 60; % 引导滤波器窗口大小
eps = 0.0001; % 引导滤波器参数
t_smooth = guided_filter(im2double(im), t, r, eps);
t_smooth = soft_matting(im2double(im), t_smooth, 0.1, 1e-5);
% 返回精细化的大气透射率和全局大气光
t = reshape(t_smooth, h, w);
A = reshape(A, 1, 1, 3);
end
```
其中,`im`是输入图像,`w`是窗口大小,返回值`t`是精细化的大气透射率图像,`A`是全局大气光。该函数首先计算暗通道图像和全局大气光,然后计算大气透射率。最后,使用引导滤波和软抠图对大气透射率进行精细化处理。
引导滤波和软抠图的实现可以使用以下两个函数:
```matlab
function q = guided_filter(I, p, r, eps)
% 引导滤波器
% I:输入图像
% p:导向图像
% r:窗口半径
% eps:正则化参数
[h, w, ~] = size(I);
n = box_filter(ones(h, w), r);
mean_I = box_filter(I, r) ./ n;
mean_p = box_filter(p, r) ./ n;
mean_Ip = box_filter(I.*p, r) ./ n;
cov_Ip = mean_Ip - mean_I .* mean_p;
mean_II = box_filter(I.*I, r) ./ n;
var_I = mean_II - mean_I .* mean_I;
a = cov_Ip ./ (var_I + eps);
b = mean_p - a .* mean_I;
mean_a = box_filter(a, r) ./ n;
mean_b = box_filter(b, r) ./ n;
q = mean_a .* I + mean_b;
end
function alpha = soft_matting(I, alpha, lambda, epsilon)
% 软抠图
% I:输入图像
% alpha:二值分割图像
% lambda:平滑参数
% epsilon:正则化参数
[h, w, ~] = size(I);
n = h*w;
I_flat = reshape(I, n, 3);
alpha_flat = reshape(alpha, n, 1);
% 计算颜色相似度矩阵W
eps = 1e-7; % 防止除以0
W = zeros(n, n);
for i = 1:n
for j = i+1:n
d = sum((I_flat(i,:) - I_flat(j,:)).^2);
W(i,j) = exp(-d/lambda);
W(j,i) = W(i,j);
end
end
% 计算矩阵D和L
D = diag(sum(W, 2));
L = D - W;
% 计算alpha的前景和背景权重
f = alpha_flat;
b = 1 - alpha_flat;
df = spdiags(f, 0, n, n);
db = spdiags(b, 0, n, n);
wf = sum(W, 2);
wb = sum(W, 1)';
Lf = df*L*df + epsilon*spdiags(wf, 0, n, n);
Lb = db*L*db + epsilon*spdiags(wb, 0, n, n);
vf = df*alpha_flat;
vb = db*(1-alpha_flat);
% 解线性方程组获得alpha的最优解
A = [Lf, vf; vb', sum(b)];
x = A\[vf; zeros(n,1)];
alpha_flat = x(1:n);
% 返回精细化的分割图像
alpha = reshape(alpha_flat, h, w);
end
```
这两个函数分别实现了引导滤波和软抠图。`guided_filter`函数使用了引导滤波器,它通过将输入图像和导向图像的均值、协方差等统计信息进行计算,来实现对导向图像的滤波。`soft_matting`函数实现了软抠图,它通过计算颜色相似度矩阵和前景、背景权重,来对二值分割图像进行精细化处理。
使用以上函数,可以得到一个基于暗通道先验的大气透射率估计图,并采用软抠图法和引导滤波法得到精细化大气透射率图。
编写程序,实现基于暗通道先验的大气透射率估计图,并采用软抠图法和引导滤波法得到精细化大气透射率图
以下是基于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库。程序实现了基于暗通道先验的大气透射率估计图,并采用了软抠图法和引导滤波法得到精细化大气透射率图。其中,软抠图法用于进一步减小估计误差,引导滤波法用于提高精度。
程序执行时,需要将实际图像的路径作为参数传入,程序会显示原图像、估计出的大气透射率图、软抠图法得到的精细化大气透射率图和引导滤波法得到的精细化大气透射率图。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![.pdf](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![.pdf](https://img-home.csdnimg.cn/images/20210720083646.png)