大气散射模型解释

大气散射模型的推导

大气中粒子的散射作用是产生雾霾的主要原因。无论是用人的肉眼观察,还是从拍摄获取的图像中观察,雾天的景象总是存在对比度和视野降低的问题。1925年,Keim & Nemnich[1]等人提出雾天图像能见度较低是大气中的悬浮粒子对光的吸收和散射造成的。1976年,John Wiley & Sons[2]等人提出粒子的散射作用造成目标和相机之间光在传输过程的衰减,并且增加了一层大气散射光(Airlight)。1999年,针对雾天能见度低的问题,Srinivasa G. Narasimhan[3]等人通过建立数学模型,解释了雾天图像的成像过程以及雾天图像包括的各个要素。该模型认为在强散射介质下,引起探测系统成像结果降质的主要原因有两种:一是目标反射光受大气中悬浮粒子的吸收和散射作用,造成目标反射光能量的衰减,这导致探测系统的成像结果亮度降低,对比度下降;二是太阳光等环境光受大气中散射介质的散射作用形成背景光,通常这部分背景光强度大于目标光,因而造成探测系统的成像结果模糊不清。

下图介绍了雾天图像的成像模型:

img

图中显示探测系统成像时接收到的光源主要来自两个部分,一是目标反射光经粒子衰减到达探测系统的光,二是来自于光源(本例为光照)经粒子散射形成的大气光。通过此物理模型建立得到雾天成像的数学模型为:

img

式中, I ( x , λ ) I(x,\lambda) I(x,λ)

### OpenCV 实现大气散射模型 大气散射模型用于模拟和去除图像中的雾霾效果。通过使用OpenCV库,可以有效地实现这一过程。下面展示了如何利用OpenCV和其他Python库来执行基于大气散射模型的去雾操作。 #### 导入必要的库 为了实现此功能,除了OpenCV外还需要导入`numpy`库来进行数组运算: ```python import cv2 import numpy as np ``` #### 定义辅助函数 定义几个帮助函数以估算大气光强度\(A\)以及透射率图\(t\): ```python def estimate_atmospheric_light(img, dark_channel): """Estimate the atmospheric light from an image.""" img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) flat_img = img.reshape(-1, 3) flat_dark = dark_channel.flatten() num_top_pixels = int(0.001 * img.shape[0] * img.shape[1]) indices = flat_dark.argsort()[-num_top_pixels:] top_intensities = [] for idx in indices: row_idx, col_idx = divmod(idx, img.shape[1]) intensity = sum(flat_img[idx]) / 3.0 top_intensities.append(intensity) max_intensity_index = np.argmax(top_intensities) best_row_col = divmod(indices[max_intensity_index], img.shape[1]) return img[best_row_col] def get_dark_channel(img, w=15): """Get Dark Channel of Image""" M, N, _ = img.shape padded = cv2.copyMakeBorder(img, w//2, w//2, w//2, w//2, cv2.BORDER_REPLICATE) dark_channel = np.zeros((M, N), dtype=np.uint8) for i in range(M): for j in range(N): patch = padded[i:i+w, j:j+w] dark_channel[i,j] = np.min(patch) return dark_channel ``` #### 主要处理流程 接下来是主要部分——应用大气散射模型去除雾气的效果: ```python def dehaze(image_path, omega=0.95, tmin=0.1): I = cv2.imread(image_path).astype(np.float64) / 255 # Estimate Atmospheric Light A dark_channel = get_dark_channel(I) A = estimate_atmospheric_light(I, dark_channel)[None,:, None] # Compute Transmission Map t transmission_map = 1 - omega * get_dark_channel((I/A)) transmission_map = cv2.bilateralFilter(transmission_map.astype(np.float32), 9, sigmaColor=7, sigmaSpace=7) transmission_map = np.clip(transmission_map, tmin, 1) # Recover haze-free image J using Eq.(6): J(x)=I(x)-A/t(x)+A result_image = ((I-A)/transmission_map[:,:,np.newaxis])+A result_image = np.clip(result_image*255, 0, 255).astype('uint8') return result_image ``` 这段代码实现了从读取含雾图片到最终获得无雾版本的过程[^2]。 #### 使用示例 调用上面定义好的`dehaze()`函数即可完成单张图片的去雾工作: ```python if __name__ == "__main__": output = dehaze("path_to_your_foggy_image.jpg") cv2.imshow("Dehazed Image", output) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一个基础版的大气散射模型实现方案。实际应用中可能需要针对特定场景优化参数设置或引入更多高级特性[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值