TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用/ g4 n* U' A6 U5 p2 P) p
9 W: b9 D4 E$ G& W( Qfunction DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
: r! g) H! _* X( e1 h% Non_Local_Means滤波器6 Q; b0 k" H, L9 y/ T
%函数输入: |3 q6 Q0 C z2 w2 \
% Nimg: 输入的图像矩阵 + 带噪声的
' @) r$ M& r! J' R9 i' @0 e% PSH: 扩展窗尺寸大小( {2 \# q; |- e; B) f' {. Z3 \
% WSH: 窗尺寸大小: s2 s4 _4 f7 T" Y, K+ O' C% I2 C
% Sigma:方差' {4 R" A- @: T7 A& v; m
%函数输出:
+ o3 x0 M) z$ s2 n" z; z8 F% DeNimg: 重构滤波图像
1 Y7 a9 k+ K6 Z/ U- B3 t- h: Z1 i4 o- d
if ~isa(Nimg,'double')7 H2 o. d" g+ H' N: R6 }
Nimg = double(Nimg)/255;+ O+ A4 \9 m/ {2 n4 |, @6 J
end
% u2 b" K7 t3 q; V% k: e
9 ]; ~% N, s, L' C3 b" `% 图像维数
n. g8 y( }+ M4 ?8 d( s7 P[Height,Width] = size(Nimg);9 |; b* w/ U& m* ^
u = zeros(Height,Width); % 初始化去噪图像矩阵: A1 I; k; Y' y
M = u; % 初始化权值矩阵
8 B; R/ H7 a! R! p; |; T" k3 UZ = M; % 初始化叠加权值 accumlated weights
5 D [3 x6 P1 B4 O( |& A w% 避免边界效应
) `2 q# q1 ]( g5 HPP = padarray(Nimg,[PSH,PSH],'symmetric','both');) X! G: X1 e: @% {* C
PW = padarray(Nimg,[WSH,WSH],'symmetric','both');
1 t3 {) o' ]( g% D: A7 T% padarray使用' l3 r' x' z2 C& w' \% ^* ^
% A =
& Z9 \9 i* e$ u M% 1 3 4
% A! H% i/ D, X+ _% 2 3 4# ^% c4 C# ^+ `' D: e
% 3 4 5
* F3 j9 C0 t* j0 I( J, }# ?% B = padarray(A, 2 * [1 1], 0, 'both')
! P4 c& ~" x/ B; ~% 0 0 0 0 0 0 0
& q. N7 c7 O7 t( H: V) i% 0 0 0 0 0 0 0: [! g# x3 z2 F" [( c
% 0 0 1 3 4 0 0
+ J( B* q* E& w( }% f% 0 0 2 3 4 0 0
: |/ q7 i( H \" V4 h; \ g% 0 0 3 4 5 0 0
5 }$ X& c4 y! N$ s9 z- D" F% 0 0 0 0 0 0 0( ~2 u1 H# |9 v; m/ F c7 t/ ]. E
% 0 0 0 0 0 0 0
) m( |% ?# n- f' ?5 E% 主循环" c, W3 I! s9 m+ \7 d
for dx = -WSH:WSH0 G E" M) ^1 U* \* U/ t
for dy = -WSH:WSH
3 ^' Q4 r3 ?) A% ~) W2 O2 {* k if dx ~= 0 || dy ~= 0
- b$ p0 P& L/ o G( w0 t; J Sd = integral_img(PP,dx,dy); % 插值图像
% }1 U; t- Y6 {% P, m % 获取对应像素点的平方差矩阵
, Q2 q. \1 R6 k5 Q3 c- U# r4 c 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);
7 q; C7 y3 i# a# W2 x % 计算每一个像素点的权值
! i, M# w$ l) `, D: \ w = exp(-SDist/(2*Sigma^2));
# \0 z% Y) @$ o! g# k6 p % 得到相应的噪声点
" v6 p8 P/ h' y) S! s( K# ?$ k; r ] v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));6 i- u, \4 W2 V5 }
% 更新去噪图像矩阵
1 L9 ~1 g; ?* @1 n3 } u = u+w.*v;* A6 ]/ W, z* z. e- m+ a
% 更新权值去噪图像矩阵7 u( h$ [' L" b& s( q& P! U
M = max(M,w);" ?" o/ W. N) R# T, z
% 更新叠加权值 accumlated weights* F( `" B0 y' t. U+ B3 ?, ^' Z
Z = Z+w;
! }$ B, ^* I% ]5 m; u' E end
: f& [; f" a. Z3 |/ N. | end
$ {$ X' s8 F& B$ N) z# W* oend
/ j' w" I3 C2 V& z% 重构图像 9 W' R( p+ @1 X! g, e+ ?! C. B& i6 Q5 D% L
f = 1;
& P6 G7 Z( e2 \. ku = u+f*M.*Nimg;
# P; {* n/ r4 G- e8 q& g8 X/ qu = u./(Z+f*M);
1 ]6 Z% C+ j: `- l4 ^DeNimg = u; % 重构去噪图像
7 C6 t4 D& [ o9 |: p" ^, n$ A) K/ H0 s
function Sd = integral_img(v,dx,dy)
1 D# f% J3 r0 i% 根据平方差,插值图像7 d `3 X1 c+ Z7 F+ ^
% 变换计算:tx = vx+dx; ty = vy+dy0 C, O& W" E" y0 P# r
t = img_Shift(v,dx,dy);# c+ L! |% A9 S' g: A# h) q
% 平方差图像9 b; x/ W6 d6 I4 e2 ?& p
diff = (v-t).^2;
0 ]& D$ j6 l& R& V; d, K% 沿行插值, l3 B3 M! P) z4 v& x- e1 a% W% a |
Sd = cumsum(diff,1); % 行叠加
* }9 D, g9 C! C v E6 \% 沿列插值 [4 L7 l% v9 ~0 k2 C1 T
Sd = cumsum(Sd,2); % 列叠加
9 G3 _) z: ~0 D5 P8 i2 ~0 Z U1 [- X. S. L" f2 Q
function t = img_Shift(v,dx,dy): f: E' ?( r6 f2 s; i4 x
% 在xy坐标系下,进行图像变换操作
& v% F7 h1 F& d0 |, r" Q0 qt = zeros(size(v));5 Y1 F$ S3 X! M9 K8 \
type = (dx>0)*2+(dy>0);% b1 _; A6 D; ^& U: E
switch type
7 h t% C! }; O. `- P6 k2 q case 0 % dx<0,dy<0: 向右下方移动0 @4 ^$ {5 Z1 R* j _9 E# y
t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);. F0 z1 S7 z- E. ?
case 1 % dx<0,dy>0: 向左下方移动
2 D( g2 E5 b# ]+ Q; E" p t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);" h7 x# Q8 u5 @* z! F# n( u
case 2 % dx>0,dy<0: 向右上方移动2 [" j2 Z7 }$ Z0 N: P) Z4 Q- {
t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);! c, w. h* S$ ^4 ]
case 3 % dx>0,dy>0: 向左上方移动) P+ @2 m8 T! `- Y" ~* {7 D, U
t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);
. V7 x- K2 W0 m6 G8 @* y) Xend
. O% u; P' ^& X8 S- d" A: m# n3 W6 i( w |
|