TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用9 I2 ~% C ^# L2 L& q% Y0 a
, P5 ?% j" W+ `, s
function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
* d9 \* m. z5 a. B3 D( l% Non_Local_Means滤波器
' E# K- Z$ P0 ~# _9 R) r%函数输入: 8 j0 f Z3 j( S1 @
% Nimg: 输入的图像矩阵 + 带噪声的2 H) s+ A) l" \9 \# ~
% PSH: 扩展窗尺寸大小
% H! r. |3 ^0 J6 b$ `; ?1 x% ]4 z% WSH: 窗尺寸大小5 r7 H/ s; [$ ^: h7 a: K* u
% Sigma:方差
0 `$ }7 d3 ~( L* S5 [%函数输出:
& o+ p; T4 a% D% DeNimg: 重构滤波图像4 F. m# H* T5 ^+ Z
- c# ? i; d0 x9 K: F: x, Wif ~isa(Nimg,'double')' n; v% T& q% g7 M1 u7 k
Nimg = double(Nimg)/255;; z7 R1 {: L( x. \9 a/ ^% J
end
+ ], v6 M6 u4 q4 B5 }0 n2 G2 `6 ^1 V$ Z6 n2 D: }1 q: V
% 图像维数! {2 B) c& E1 m4 |
[Height,Width] = size(Nimg);
& u8 o9 ^' u( e/ q! ju = zeros(Height,Width); % 初始化去噪图像矩阵
! w$ `9 _1 `: f: rM = u; % 初始化权值矩阵 D. b& b* w; Y5 B1 x9 |) c
Z = M; % 初始化叠加权值 accumlated weights
6 J7 Q( V: a$ V% 避免边界效应
5 @1 u% c; z/ k* E4 jPP = padarray(Nimg,[PSH,PSH],'symmetric','both');
1 ^$ E7 R6 I% R) JPW = padarray(Nimg,[WSH,WSH],'symmetric','both');
$ O. Q# A6 \5 z2 G; }% padarray使用
4 [7 W; T4 u/ j3 \/ B3 i+ t( @% A =# O" b5 c; P7 p# f% h
% 1 3 4
' y) w( m! F2 z! s/ p% 2 3 4
) n1 Q) d9 |/ Q& r$ H% 3 4 5
1 q# Z9 G2 u% ?2 n* L3 a |% B = padarray(A, 2 * [1 1], 0, 'both')
1 o+ q( Y5 o3 `% 0 0 0 0 0 0 0
8 J/ }# _8 C6 Z" G' a% 0 0 0 0 0 0 0
- c" H* H# [# H, k. W6 {% 0 0 1 3 4 0 0! W% o5 R0 |& \) O) I( y( U
% 0 0 2 3 4 0 0* b1 R3 j7 A! P- D: `% ]
% 0 0 3 4 5 0 0
% c* j' `5 ?* ] g6 T: c% 0 0 0 0 0 0 0, V- E3 p l# r4 W' T& A
% 0 0 0 0 0 0 0
& i) B. x1 a7 J+ m& I2 J) i, z% 主循环
; e/ g0 G8 l2 ^% Z' lfor dx = -WSH:WSH
6 a7 Q: y- ^3 O2 Y5 {1 v* I8 S for dy = -WSH:WSH+ \" a$ F" S. B; h/ y
if dx ~= 0 || dy ~= 0
+ q: L: N8 b" a& S2 A$ [! I) e9 ] Sd = integral_img(PP,dx,dy); % 插值图像# J8 u' U! w3 ]0 j1 Z
% 获取对应像素点的平方差矩阵
, q5 l! W/ J" E& S% Y 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); 0 q( Y' V; i c9 {, [6 I
% 计算每一个像素点的权值
' u, A% h% _2 W/ \, C* h w = exp(-SDist/(2*Sigma^2));
3 H: j; _. j, v% F9 W8 e' E4 I8 g % 得到相应的噪声点
q% m& c( L& u7 |5 t! Q v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));
7 K' x! C) l/ J; ~: N6 V f % 更新去噪图像矩阵
V% H! K# D6 ~7 K u = u+w.*v;
9 c# r: f7 }8 E& {( t4 {1 q8 }4 C % 更新权值去噪图像矩阵
; f% p4 @* |$ \: U* ` M = max(M,w);' c) n. n/ t$ U# d( E
% 更新叠加权值 accumlated weights
* _# h0 M) i. B, @) M+ j5 |# n Z = Z+w;
3 f# U3 p6 F1 y7 {+ m7 v- Y! q7 d+ F end8 b; z4 C8 H- a
end
( `9 e2 p0 I/ o+ h) n! oend
8 r8 F8 h8 [6 Z" O' M1 k% 重构图像
+ a6 H& U4 @- D+ l- Vf = 1;: T; p$ J3 v. F
u = u+f*M.*Nimg;
3 V! F) R% C9 x* H O; Qu = u./(Z+f*M);/ T- H2 V& k' t0 [& x0 N' R; d
DeNimg = u; % 重构去噪图像
) v7 C" {( N( } e$ i1 x7 Z' N7 H5 {' F3 d3 ?+ K
function Sd = integral_img(v,dx,dy)
' L* e/ _7 z, d% 根据平方差,插值图像
$ x; z7 M! A! T# i! M# A% 变换计算:tx = vx+dx; ty = vy+dy
& y% d9 E6 v. ^! O, F1 f4 l7 ct = img_Shift(v,dx,dy);: i# B0 R4 Y( q# h( D j
% 平方差图像# m, o( A$ O& f8 J1 X
diff = (v-t).^2;! f, G% h8 K2 Z: L) M/ T
% 沿行插值
2 P8 X; i( g* t0 q V8 \& g& JSd = cumsum(diff,1); % 行叠加
+ X* J; \% q/ i% 沿列插值2 a5 k* k% U; j, x; X2 v
Sd = cumsum(Sd,2); % 列叠加. K+ z% x: }9 i* v, Q& d3 l
( m$ d- z- X: p7 r
function t = img_Shift(v,dx,dy)8 D+ M" d0 e. s6 @
% 在xy坐标系下,进行图像变换操作 @( F) H# F# `3 v8 ?: c
t = zeros(size(v));
5 G+ D8 J4 r/ C& t* stype = (dx>0)*2+(dy>0);9 m$ _) o/ D3 I8 }6 j9 z4 f
switch type
6 ?# h' c" n7 Z2 E* x4 p$ |( y case 0 % dx<0,dy<0: 向右下方移动4 t6 h/ f2 L* {2 _7 U/ W) M
t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
8 G0 C1 R! M# {2 O case 1 % dx<0,dy>0: 向左下方移动0 P* X5 W9 I4 A- m0 U; u4 X% G! m
t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);* w) o) J2 i' r$ {- D/ W
case 2 % dx>0,dy<0: 向右上方移动, r# X: i) E3 ]7 F. e% v1 ]1 @
t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);
: \ r/ z$ K* ^$ x% v& X7 f Y case 3 % dx>0,dy>0: 向左上方移动7 D2 B! n$ Z+ S) o( H
t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);6 G: P$ Y6 w# E7 u% Q! q- G
end% c" K1 W7 a* S- j
|
|