TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用
: y1 ]1 A! }. o( p& i4 T' X0 F q; Q
function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
, W+ X, W+ I1 ], ^, D5 ^3 D% Non_Local_Means滤波器; ]" P8 E. b8 q, M( l; O4 Y
%函数输入: ' Q4 ^) t8 t# V6 K+ y: `
% Nimg: 输入的图像矩阵 + 带噪声的
* X) I. I$ c' O5 G _4 i5 i8 K& F% PSH: 扩展窗尺寸大小) c3 g3 a( q; S, _. G' n( i
% WSH: 窗尺寸大小9 k* t1 J7 K) k: D+ U8 S8 ]
% Sigma:方差% B: p( k/ `- g; L4 l- H
%函数输出: + @- y( g! k; W
% DeNimg: 重构滤波图像8 a7 U: T" [( }# O
7 Y3 a- m4 F6 Q9 e
if ~isa(Nimg,'double')
3 Z) F, U% ^0 n# `' B1 d Nimg = double(Nimg)/255;
; U" V l4 z, J M2 C" k# i4 Oend
3 I. G4 S9 [9 ?3 I
* B! ^; o$ w6 R5 G0 ?7 B% 图像维数, w9 f' J- x2 _; H2 _0 v' _* P: z
[Height,Width] = size(Nimg);% y2 ~$ g* Y1 s# N5 F8 l, D0 X
u = zeros(Height,Width); % 初始化去噪图像矩阵
2 O! h5 O& `5 a: d6 M: x: E$ c. ?M = u; % 初始化权值矩阵
7 l0 e" Z6 Z |- u2 m( E2 dZ = M; % 初始化叠加权值 accumlated weights/ g. Y& E5 R+ E3 k) ~. P4 l
% 避免边界效应& d# b' T' R0 D4 H% f+ y1 s4 R
PP = padarray(Nimg,[PSH,PSH],'symmetric','both');# f- w6 H! n+ R: W& i+ U6 P
PW = padarray(Nimg,[WSH,WSH],'symmetric','both');
: b: X, {5 z4 t* r0 z% padarray使用
5 h& Z0 F9 I) W/ R% U8 {' P i& P% A =
6 l) d3 I1 c' q% 1 3 41 F( v$ z5 r0 j2 n
% 2 3 4/ k0 o+ E" i* X2 q# k4 C0 n
% 3 4 5! D1 I- z3 |& e N; J. o
% B = padarray(A, 2 * [1 1], 0, 'both')+ Y* J/ F" a, s
% 0 0 0 0 0 0 0
' \& ^; ], f1 J) i1 C% 0 0 0 0 0 0 02 n0 j2 Z( F7 y: W2 U( e) A/ a
% 0 0 1 3 4 0 05 e: ?) q1 S) R! E- e9 _( Y
% 0 0 2 3 4 0 0
, Z, r+ v' L1 i9 g% W; A% 0 0 3 4 5 0 00 Z7 k1 ^9 R: q
% 0 0 0 0 0 0 0& p L% N* D% g1 d
% 0 0 0 0 0 0 02 }' E) i6 l% \" p& r: j
% 主循环
- S4 P' m5 E" ~0 |0 a. ofor dx = -WSH:WSH9 r* ^. e) h! `6 i l1 K. x+ D t
for dy = -WSH:WSH6 z8 x4 E$ t: m' e: V
if dx ~= 0 || dy ~= 0
$ A7 r. ?1 D% P" x0 s% w Sd = integral_img(PP,dx,dy); % 插值图像% X; F" H9 R @! G; x! @
% 获取对应像素点的平方差矩阵: W: Q$ X# a( W& T: N8 o" ]
SDist = Sd(PSH+1:end-PSH,PSH+1:end-PSH)+Sd(1:end-2*PSH,1:end-2*PSH)-Sd(1:end-2*PSH,PSH+1:end-PSH)-Sd(PSH+1:end-PSH,1:end-2*PSH); 3 M% ]7 k9 o u i! g
% 计算每一个像素点的权值/ W1 b8 E0 ^3 O; Z) q
w = exp(-SDist/(2*Sigma^2)); G' l& @6 t6 {6 @' n
% 得到相应的噪声点& ~( {% a. W% M& C1 W( n8 @
v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));, W, N5 Y: Z% `5 i% X
% 更新去噪图像矩阵, a# ]! [" M" h5 m* z: R$ x
u = u+w.*v;4 S! J9 x0 t& Z9 `2 f1 Y
% 更新权值去噪图像矩阵
) C# o5 Z# j: m M = max(M,w);
. A! ?4 _" T" G/ [8 w% J0 f % 更新叠加权值 accumlated weights
* J- p5 s8 D6 X+ Q9 N P Z = Z+w;
+ n% W$ z, a& n( C; a& N8 n end V+ ~" e/ I% }
end, [& M" J1 O |2 h' {, j. u
end7 d v3 b- _4 A
% 重构图像 - x) ^7 n( G8 ^+ w9 D$ z) j% V* j4 Q
f = 1;* x3 J6 N! H, z& v* Y/ K/ o
u = u+f*M.*Nimg;! I9 e" \! Z. f4 o: ?
u = u./(Z+f*M);
2 [% r% o0 S+ ~& _9 J+ C0 gDeNimg = u; % 重构去噪图像
% n4 c( d* m+ b- x% D' B
+ M4 |( S8 J& H8 {9 ^- e, ~3 qfunction Sd = integral_img(v,dx,dy); w+ ^$ W5 ~8 n: }) ~
% 根据平方差,插值图像
; e+ \. D) l4 ?, q8 _% 变换计算:tx = vx+dx; ty = vy+dy
H% F" S5 D# a- d0 i- Nt = img_Shift(v,dx,dy);# w; S1 E" K4 G( F, l6 {" h
% 平方差图像
+ @7 y' J5 n& z8 L$ {' l0 _' j7 m# A% ldiff = (v-t).^2;2 t8 Y1 J9 W5 H/ c" Y' N
% 沿行插值
2 i" t) M6 g' d P/ r- sSd = cumsum(diff,1); % 行叠加
* f! l0 A1 S2 P% 沿列插值
$ F2 i7 W+ g1 A5 c4 b HSd = cumsum(Sd,2); % 列叠加
; X9 _+ J) s# o& C' _) Q0 r5 ]$ F, J3 b4 W7 ?4 {
function t = img_Shift(v,dx,dy)# ?& E1 t* r2 \4 y/ B& f
% 在xy坐标系下,进行图像变换操作
3 L4 F) d3 t+ U" Z2 W5 ^t = zeros(size(v));
" |' U/ }! T7 ]- Jtype = (dx>0)*2+(dy>0);
8 B2 I3 Y8 l) N. Vswitch type
0 y7 z0 W0 ~$ K8 j) J& a+ @8 m case 0 % dx<0,dy<0: 向右下方移动3 r D# h/ M) B9 S+ `, M
t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
! o6 _1 B! o3 k) o* D! E, H case 1 % dx<0,dy>0: 向左下方移动 X" _; X& B4 g0 j; b: Y
t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
& W7 R% |" L) h* S6 n case 2 % dx>0,dy<0: 向右上方移动
% T m% e I! K+ ~5 X, t3 i* F t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);# @8 \2 p% y# R4 u' ~
case 3 % dx>0,dy>0: 向左上方移动
2 _6 A( C* v9 C t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);2 `$ v- a& b$ }2 \0 g2 F: y+ i. M
end# `# k& O% a! }: Q" n
|
|