TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用
; K/ y0 H* [. t! l; ^7 t) e* o1 B" }
function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
/ l. \% I$ u' R% Non_Local_Means滤波器
+ d$ [7 q% e" |%函数输入:
* `& o- r: J! K! n* ~% Nimg: 输入的图像矩阵 + 带噪声的
l8 R: o4 d# Z# d% PSH: 扩展窗尺寸大小# f9 B/ ?' o B: q. O8 i$ u
% WSH: 窗尺寸大小
6 P& G4 l/ B. S8 U [. m& X% Sigma:方差
( P$ N$ K c' m- H6 G%函数输出:
# K; U) H" e$ C% DeNimg: 重构滤波图像, R1 a" C, h7 E
. k4 @3 ~* n. V$ p( D9 v- D* U, Y
if ~isa(Nimg,'double')
; v6 \; ~6 ^3 M3 }0 Q. }' t Nimg = double(Nimg)/255;4 w. J+ H4 N+ _
end
9 l% b; M# ]: S: G% d
H2 T8 N. \8 b% J" ~& t+ e% 图像维数
! ~+ H5 M+ V/ H% {% v[Height,Width] = size(Nimg);0 l4 Z: T- z) \( e8 H
u = zeros(Height,Width); % 初始化去噪图像矩阵4 V8 T2 r4 G1 J" e: C0 T
M = u; % 初始化权值矩阵( J9 u H) }4 W5 H- E3 B/ ]
Z = M; % 初始化叠加权值 accumlated weights
+ d# M0 |! A) C1 d3 V. X. M% 避免边界效应6 x5 A2 \7 B8 z. h
PP = padarray(Nimg,[PSH,PSH],'symmetric','both');
- s$ ^2 c# o2 A0 N rPW = padarray(Nimg,[WSH,WSH],'symmetric','both');
y2 e& Z/ [' l" ^9 G% padarray使用
4 ?2 U4 Z' e5 D0 l$ y% A =
: ]' d) X) {4 k7 D$ M# S% 1 3 4
! F! a% L& s1 E; P9 B d% 2 3 42 g# g- F" h7 B& S( g) A
% 3 4 5
# r% q" G1 ^( {& o( u, ^% B = padarray(A, 2 * [1 1], 0, 'both')
) G H: A ?( z5 @& E; `% 0 0 0 0 0 0 0
4 g, [9 X S1 p- v2 w% 0 0 0 0 0 0 0
4 g9 N& _ ?- f. p% 0 0 1 3 4 0 0
- M& W' _! V" h& B* j% 0 0 2 3 4 0 0
) M( y/ f' m- o" A8 M" p% 0 0 3 4 5 0 06 B) ~- \! M" b8 E
% 0 0 0 0 0 0 0
) D4 z6 \8 J& k# s, m6 u/ L) L% 0 0 0 0 0 0 0
% }6 i" x/ J3 g/ H7 g2 Y3 F- C% 主循环( C n/ [$ v0 Q) O
for dx = -WSH:WSH
3 }& G" o' \% [9 y+ D/ ~ for dy = -WSH:WSH$ N$ j6 e7 N5 o& T( X6 N/ M
if dx ~= 0 || dy ~= 0
6 n1 f; _9 w6 O1 W7 v* ` Sd = integral_img(PP,dx,dy); % 插值图像# M) F! S; G3 _4 c/ C/ o; Q" u6 y z: H- ]
% 获取对应像素点的平方差矩阵$ Q" h0 Q, P3 U4 l
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);
( q; I t3 x/ B: d % 计算每一个像素点的权值- m. s- i" P1 g9 H
w = exp(-SDist/(2*Sigma^2));
0 C# P0 s9 l* D( c' s % 得到相应的噪声点) c k5 Y) N- V" |8 i
v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));
- g) W( k) T, A( l5 ` % 更新去噪图像矩阵
B$ [) w, s2 t, `8 ?# A2 m, ^ u = u+w.*v;
" q* k/ i1 S0 n$ [9 c6 {" i# E9 v % 更新权值去噪图像矩阵8 Q. ~" t( d" A Q* @
M = max(M,w);7 _; |! P! C. b7 _! P
% 更新叠加权值 accumlated weights
! s$ [6 @2 w) z% {4 } Z = Z+w;9 E" E! D0 t4 {% y( m4 I- ^
end
! [8 C6 O) H. ~- Z+ X% u) J end
3 S& ]' B; A$ T, p+ \end: V+ i) o/ G( z5 |
% 重构图像
3 F \' K5 q3 E" n( g# if = 1;
4 R3 P" O: i6 Q5 W1 Mu = u+f*M.*Nimg;' ?) P" t5 Y7 U5 w
u = u./(Z+f*M);* g7 u, Z2 u5 b7 K3 K
DeNimg = u; % 重构去噪图像
' o5 k, G" C% M5 m
6 G7 Y( S; s vfunction Sd = integral_img(v,dx,dy)+ C. i* I. ?5 U, P$ R5 K
% 根据平方差,插值图像8 y5 d2 t3 K8 d A8 }" j
% 变换计算:tx = vx+dx; ty = vy+dy5 t& f# `9 i+ ]
t = img_Shift(v,dx,dy);
- t% s/ `/ |. k: ~& r7 ^% 平方差图像
9 h* J% r) A# S8 z9 v% [2 Ediff = (v-t).^2;7 |, u7 g4 w" @4 m' g! W+ L2 g
% 沿行插值
2 i$ M: F' Q* G) Z! rSd = cumsum(diff,1); % 行叠加
2 V8 h3 h* y) e( e7 Z. Y% 沿列插值
& ^( z2 C9 Z7 m, Z- tSd = cumsum(Sd,2); % 列叠加# s3 N$ s" e, O: }) Z7 B; \( U
7 ?% {/ w# g& ^6 ~! E# ~9 Ffunction t = img_Shift(v,dx,dy)- Q5 G7 F2 A0 ?+ K# J
% 在xy坐标系下,进行图像变换操作
* }. z! m$ `0 P9 pt = zeros(size(v));; g5 c1 X' ^, r* K1 ]6 T
type = (dx>0)*2+(dy>0);& x7 w K. E& `) u" J4 z( B: c
switch type; K% }2 B. X( S/ x2 j- C J
case 0 % dx<0,dy<0: 向右下方移动8 u2 q4 p( u& E
t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
. ^7 [9 ~$ ~6 h/ h0 S, W case 1 % dx<0,dy>0: 向左下方移动
+ t! c0 ]- x! X" s. c( r- i7 L t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
9 g6 b: v0 n$ \) E: L case 2 % dx>0,dy<0: 向右上方移动
* Z% T. J; u7 X' W t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);# j2 o0 B+ v# O3 R Y0 \
case 3 % dx>0,dy>0: 向左上方移动
" w7 X6 q2 c. O$ A3 g) m t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);0 o' d3 f1 _* X
end
: P# e: {7 G0 G |
|