|
Lee滤波器:
im_ret = Lee( im, 9, 'same', 10, 'symmetric', 1);
- function im_ret = Lee( im, w_size, out_size, NL, bound, flag )
- % im:SAR影像
- % w_size:窗口大小,奇数 3 5 7 9等
- % out_size:输出图像的大小,可以是'same'或者'full'
- % NL:number of Looks,等效视数
- % bound:边缘扩展模式,分为'symmetric','replicate','circular'。
- % flag:计算时是否包含中心像素,0为不包含,1为包含。
- %
- % bound和flag主要是给im_mean_var用的 :)
- % 函数输出:
- % im_ret:滤波结果
- if ~isa(im,'double')
- im = double(im)/255;
- end
- [im_Mean, im_Var] = im_mean_var(im, w_size, out_size, bound, flag); % 求均值和方差
- im_Std = sqrt(im_Var); % 开方
- Ci = im_Std ./ im_Mean; % 变差系数
- Cu = sqrt(1/NL); % 噪声变差系数
- tmp = 2*log(Cu) - 2.*log(Ci+0.1);
- tmp = exp(tmp);
- W = 1 - tmp;
- im_ret = im .* W + im_Mean .* (1 - W); % 滤波结果
复制代码- function [im_Mean, im_Var] = im_mean_var(im, w_size, out_size, bound, flag)
- % 函数输入:
- % im: 待求的影像,或者矩阵
- % w_size: 窗口的大小,如5代表5*5的窗口
- % out_size:输出图像的大小,可以是'same'或者'full'
- % bound: 边缘的扩展模式,分为'symmetric','replicate','circular'。
- % flag:计算时是否包含中心像素,0为不包含,1为包含。
- % 函数输出:
- % im_Mean:均值影像/矩阵
- % im_Var:方差影像/矩阵
- % 均值滤波器
- h = ones(w_size);
- h_size=w_size^2;
- if flag == 0
- h((w_size+1)/2,(w_size+1)/2) = 0;
- h_size = h_size - 1;
- end
- h = h ./ h_size;
- im_Mean = imfilter(im, h, bound, out_size);
- % 方差
- im_Var = zeros(size(im));
- % 将原始矩阵按照bound的模式进行边缘扩展
- im_pad = padarray(im, [(w_size-1)/2 (w_size-1)/2], bound);
- % A = [1 2; 3 4];
- % B = padarray(A,[3 2],'replicate','post')
- % B =
- % 1 2 2 2
- % 3 4 4 4
- % 3 4 4 4
- % 3 4 4 4
- % 3 4 4 4
-
- imsize = size(im_pad);
- row=imsize(1); % 行
- col=imsize(2); % 列
- tmp = (w_size-1)/2;
- for i=1:1:row-tmp*2
- for j=1:1:col-tmp*2
- im_sub = imcrop(im_pad, [i, j, w_size-1, w_size-1]); % 取小窗口
- m2v=im_sub(:);
- if(flag == 1) % 如果包含中间点
- im_Var(j,i) = var(m2v,1); % 不是无偏估计(N-1),而是用N
- else % 如果不包含中间点
- tt = zeros(w_size^2-1 , 1);
- tt(1:(w_size^2-1)/2) = m2v(1:(w_size^2-1)/2);
- tt((w_size^2-1)/2+1:end) = m2v((w_size^2-1)/2+2:end);
- im_Var(j,i) = var(tt,1);
- end
- end
- end
复制代码
|
|