《Optimized contrast enhancement for real-time image and video dehazing》大气光估计策略

本文介绍了一种改进的大气光A估计方法,用于实时图像和视频去雾。传统方法依赖于图像中最亮的像素点,而新方法通过四叉树子空间划分的层次搜索策略,基于像素方差来提高估计精度。

最近研究去雾算法中接触到了Jin-HwanKim 2013年的paper,如标题,文中提出一种新的大气光估计策略,现对其进行粗略总结。
Optimized contrast enhancement for real-time image and video dehazing原文
文章主页

大气光A估计
传统大气光A通常使用图像中最亮的像素点,因为雾霾使得图像看起来灰蒙蒙的,导致图像灰度值较高。然而,场景中不可避免地可能出现部分本身灰度值就很高的像素点,如果继续使用传统方法会出现估计。
作者提出了一个更加可靠的估计方法,在雾霾区域像素方差值一般较小。即雾霾区域内图像像素间的差异较小,这样可以排除那些存在高亮像素点但细节较多的区域。因此,作者提出了一种称为四叉树子空间划分的层次搜索方法。
具体步骤是:

  1. 输入图像:Input,若其尺寸小于固定阈值(如200),进入步骤2,否则进入步骤5。
  2. 将图像等分为四个子块,分别计算每个子块R,G,B三分量的均值与方差。
  3. 对于每个子块,将对应分量的均值减去方差得到差值,再将三个分量的差值相加,记为每个子块的得分score。
  4. 找到得分最大的子块,对此子块进入步骤1进行递归操作。
  5. 选择当前块计算大气光,即找到当前块中与(255,255,255)最接近的像素点。
    ∣ ∣ ( I r ( p ) , I g ( p ) , I b ( p ) ) − ( 255 , 255 , 255 ) ∣ ∣ ||(Ir(p) , Ig(p), Ib(p)) - (255, 255, 255)|| (Ir(p),Ig(p),Ib(p))(255,255,255)

matlab实现

close all;
I = imread('test.png'): %load image
img_rgb = double(I);
[hei, wid, ~] = size(img_rgb);

figure, imshow(I); hold on; %hierarchical search display
line([1 wid], [hei/2 hei/2], 'Color', 'g');
line([wid/2 wid/2], [1 hei], 'Color', 'g');
yoffset = 1;
xoffset = 1;

while(hei * wid > 200)
   % divide the previous image into four equal subblocks
    img_ul = img_rgb(1:hei/2, 1:wid/2, :); 
    img_ur = img_rgb(1:hei/2, wid/2+1:wid, :);
    img_ll = img_rgb(hei/2+1:hei, 1:wid/2, :);
    img_lr = img_rgb(hei/2+1:hei, wid/2+1:wid, :);

    % calculate block mean - std
    dpscore(1) = mean2(img_ul(:,:,1)) - std2(img_ul(:,:,1));
    dpscore(2) = mean2(img_ul(:,:,2)) - std2(img_ul(:,:,2));
    dpscore(3) = mean2(img_ul(:,:,3)) - std2(img_ul(:,:,3));
    afscore(1) = sum(dpscore(:));
    
    dpscore(1) = mean2(img_ur(:,:,1)) - std2(img_ur(:,:,1));
    dpscore(2) = mean2(img_ur(:,:,2)) - std2(img_ur(:,:,2));
    dpscore(3) = mean2(img_ur(:,:,3)) - std2(img_ur(:,:,3));
    afscore(2) = sum(dpscore(:));

    dpscore(1) = mean2(img_ll(:,:,1)) - std2(img_ll(:,:,1));
    dpscore(2) = mean2(img_ll(:,:,2)) - std2(img_ll(:,:,2));
    dpscore(3) = mean2(img_ll(:,:,3)) - std2(img_ll(:,:,3));
    afscore(3) = sum(dpscore(:));
    
    dpscore(1) = mean2(img_lr(:,:,1)) - std2(img_lr(:,:,1));
    dpscore(2) = mean2(img_lr(:,:,2)) - std2(img_lr(:,:,2));
    dpscore(3) = mean2(img_lr(:,:,3)) - std2(img_lr(:,:,3));
    afscore(4) = sum(dpscore(:));
    
    % select the region with the highest score and 
    % divide it further into four smaller regions
    [maxscore, maxind] = max(afscore);
    clear img_rgb;
    if(maxind == 1)
      img_rgb = img_ul;
      [hei, wid, ~] = size(img_ul);
    elseif(maxind == 2)
      img_rgb = img_ur;
      [hei, wid, ~] = size(img_ur);
      xoffset = xoffset + wid;
    elseif(maxind == 3)
      img_rgb = img_ll;
      [hei, wid, ~] = size(img_ll);
      yoffset = yoffset + hei;
    elseif(maxind == 4)
      img_rgb = img_lr;
      [hei, wid, ~] = size(img_lr);
      yoffset = yoffset + hei;
      xoffset = xoffset + wid;
    end
    line([xoffset, xoffset+wid], [yoffset+hei/2, yoffset+hei/2], 'Color', 'g');
    line([xoffset+wid/2, xoffset+wid/2], [yoffset, yoffset+hei], 'Color', 'g');
end

if(maxind == 1)
  rectangle('Position', [xoffset, yoffset, wid, hei], 'FaceColor', 'r', 'EdgeColor', 'g');
elseif(maxind == 2)
  rectangle('Position', [xoffset+wid/2, yoffset, wid, hei], 'FaceColor', 'r', 'EdgeColor', 'g');
elseif(maxind == 3)
   rectangle('Position', [xoffset, yoffset+hei/2, wid, hei], 'FaceColor', 'r', 'EdgeColor', 'g');
elseif(maxind == 4)
   rectangle('Position', [xoffset+wid/2, yoffset+hei/2, wid, hei], 'FaceColor', 'r', 'EdgeColor', 'g');
end

% choose the color vector which minimizes the distance as the atmospheric light
nDiff = abs(img_rgb - 255*ones(hei, wid, 3));
nDistance = nDiff(:,:,1) + nDiff(:,:,2) + nDiff(:,:,3);  %here abs-sum can be replaced by square-sum
[rowind, colind] = find(nDistance == max(nDistance(:)));

Airlight(1) = img_rgb(rowind(1));
Airlight(2) = img_rgb(rowind(2));
Airlight(3) = img_rgb(rowind(3));
'
### 实现与优化 #### 技术概述 为了实现实时辐射场渲染中的高效性和高质量,3D 高斯点绘技术采用稀疏分布的三维高斯函数来表示场景中的物体。这些高斯分布在空间中形成基础结构,能够有效地捕捉复杂的空间特性[^1]。 ```python import numpy as np def create_gaussian_distribution(points, covariances): """创建基于给定均值和协方差矩阵的多维正态分布""" gaussians = [] for point, cov in zip(points, covariances): gaussian = multivariate_normal(mean=point, cov=cov) gaussians.append(gaussian) return gaussians ``` #### 协方差优化 通过调整各向异性协方差参数,可以更精确地描述对象表面细节。具体来说,通过对原始数据集的学习过程自动调节每个高斯组件的方向和尺度,从而获得更加逼真的视觉效果[^2]。 ```python from scipy.stats import multivariate_normal def optimize_anisotropic_covariance(data_points): optimized_covs = [] for data_point in data_points: # 假设这里有一个学习算法用于计算最优协方差 optimal_cov = learn_optimal_covariance(data_point) optimized_covs.append(optimal_cov) return optimized_covs ``` #### 可视化处理 当对经过优化后的3D高斯进行缩放和平移变换后再做可视化展示时,其呈现出来的异形形状确实能很好地反映出目标物体内在复杂的几何属性[^3]。 ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def visualize_scaled_gaussians(scaled_gaussians): fig = plt.figure() ax = fig.add_subplot(111, projection='3d') for scaled_gaussian in scaled_gaussians: x, y, z = generate_surface_coordinates(scaled_gaussian) ax.plot_surface(x, y, z) plt.show() ``` #### 渲染加速策略 引入了一种新的可见性感知渲染算法,在保持图像质量的同时显著提高了帧率表现。该方法特别适用于大规模无边界完整场景以及高清分辨率下的快速显示需求[^4]。 ```python class VisibilityAwareRenderer: def __init__(self, scene_model): self.scene_model = scene_model def render_frame(self, camera_pose): visible_objects = determine_visible_objects(camera_pose, self.scene_model) rendered_image = composite_images(visible_objects) return rendered_image ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值