如何在Matlab中实现大气湍流退化函数生成退化图像
Matlab实现大气湍流图像退化的方法
实现逻辑
大气湍流退化属于频域退化操作,核心流程为:
- 将输入图像从空域通过FFT变换到中心化的频域
- 频域矩阵和你提供的退化函数
H(u,v)=e^(-k(u^2 + v^2)^(5/6))做点乘运算 - 将运算结果通过逆FFT变换回空域,得到最终退化图像
完整可运行代码
% 1. 读入并预处理图像 I = imread('test.jpg'); % 替换为你的图像路径 if size(I,3) == 3 I = rgb2gray(I); % 彩色图默认转灰度处理,若要保留彩色可对三个通道分别执行后续操作 end I = im2double(I); % 转为double类型避免整数运算精度损失 [M, N] = size(I); % 2. 生成中心化的频域坐标网格 u = linspace(-floor(N/2), floor((N-1)/2), N); v = linspace(-floor(M/2), floor((M-1)/2), M); [U, V] = meshgrid(u, v); % 3. 按公式构建大气湍流退化函数 k = 0.002; % 湍流强度系数,可自行调整 dist_sq = U.^2 + V.^2; % 频域坐标点到中心的距离平方 H = exp(-k * (dist_sq).^(5/6)); % 4. 频域滤波计算退化图像 F_original = fftshift(fft2(I)); % 原图FFT并中心化 F_degraded = F_original .* H; % 频域点乘退化函数 I_degraded = real(ifft2(ifftshift(F_degraded))); % 逆FFT转回空域,取实部消除浮点误差虚部 I_degraded = max(min(I_degraded, 1), 0); % 裁剪数值到0~1的有效范围 % 结果展示与保存 imshowpair(I, I_degraded, 'montage'); title('原图 / 大气湍流退化图'); % imwrite(I_degraded, 'turbulence_degraded.jpg'); % 取消注释可保存结果
参数与注意事项
- 湍流强度参数
k:值越大退化效果越强烈,弱湍流建议取0.00050.001,中等湍流取0.0010.005,强湍流取0.005以上 - 处理彩色图像时,不要直接对三通道原图做FFT,需要拆分R/G/B三个通道分别执行退化操作后再合并
- 频域坐标必须做中心化处理,否则会出现退化效果偏移、边界异常的问题
内容的提问来源于stack exchange,提问作者Halexia's
相关产品推荐
相关产品推荐

