TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用
8 V) g: o9 F: E1 l$ @
, ^! A6 q- | T& F3 @2 [% O, R% ?function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
4 g' ^, C# l+ ^" m/ l; g: c% N' q% Non_Local_Means滤波器
9 x" C0 o. M4 d3 e0 n%函数输入:
" C4 n) f# c; K) t9 R% Nimg: 输入的图像矩阵 + 带噪声的& n- b7 f6 L& b: H3 C1 V, {& R
% PSH: 扩展窗尺寸大小. p* _5 v! r/ C5 a3 S# {- G: D" c& P
% WSH: 窗尺寸大小
% s! s9 I# F& h8 ]% Sigma:方差
; b& R/ X, Q& i%函数输出:
3 q: t" ]7 X% v; D) q! J" F% DeNimg: 重构滤波图像- i3 i4 N5 M5 R6 {
+ `' }$ Q" U& r1 M6 d" w: |. u* n7 X
if ~isa(Nimg,'double')
; {" o" V1 g' g3 Q5 J. B* S Nimg = double(Nimg)/255;
/ T+ u. p' q4 {! zend- h3 ~# Q. ~% o; ~# L g1 `
" F* ?% x4 c `% v% 图像维数; c1 l6 x8 s/ `( }( i& T
[Height,Width] = size(Nimg);5 I9 J9 S# |; T) ~4 R7 `
u = zeros(Height,Width); % 初始化去噪图像矩阵
% n3 @( v) `7 F" }# IM = u; % 初始化权值矩阵5 r2 F3 b- {2 M& f+ k1 x9 r2 e
Z = M; % 初始化叠加权值 accumlated weights) X9 f7 [& ~3 T- O+ ]. I: J3 |/ [# s
% 避免边界效应
$ I- ?! e& @4 T( j2 g# m) t: d) s! c: ~$ mPP = padarray(Nimg,[PSH,PSH],'symmetric','both');1 u E$ z8 A1 p: Z# A3 j
PW = padarray(Nimg,[WSH,WSH],'symmetric','both'); M; A# _, Z; w
% padarray使用- ~1 S2 T+ {& o- f- T4 R" H
% A =
' u% ^) T/ G3 N; O) Z' z% 1 3 4
+ N% S+ Y, b& b/ U% 2 3 4: H g) _2 l" t9 ]
% 3 4 5+ Y+ h1 a" y/ z' u, n" v7 g
% B = padarray(A, 2 * [1 1], 0, 'both')
6 U9 i/ ~1 c* g8 Q! p& _0 s. p" R% 0 0 0 0 0 0 0
/ `9 H' ]0 f" w3 n3 R! l% 0 0 0 0 0 0 0
: M( o/ t. J- r2 ~4 u- r' c) ]1 B% 0 0 1 3 4 0 0
0 h! o1 k! F) [# H% 0 0 2 3 4 0 0* h; }: \* b% y" {7 j& E1 ` V# K
% 0 0 3 4 5 0 0
2 r- A6 M4 G7 }- o) P3 {9 B% 0 0 0 0 0 0 0
/ b' i# b, Y7 D; w3 H5 V! \% 0 0 0 0 0 0 0' T/ g2 M, C5 a; @
% 主循环 J( ]3 [/ K: n% V/ C& J9 B9 j
for dx = -WSH:WSH2 `- i+ z* u( {+ |' }
for dy = -WSH:WSH; s$ E/ X' z3 s1 q) \5 v
if dx ~= 0 || dy ~= 0
0 B# ^1 i; M8 O$ \3 R# H Sd = integral_img(PP,dx,dy); % 插值图像; F3 r& e0 E. U' {) D& \6 c3 \1 W* R
% 获取对应像素点的平方差矩阵
5 v8 `* Q4 u& a/ {$ R 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); 9 L# [, i& x5 S9 q5 L7 H% H& _
% 计算每一个像素点的权值
: m' B" n4 Q* U- x w = exp(-SDist/(2*Sigma^2));
/ z; Q+ {9 m5 l2 r. ^ N % 得到相应的噪声点
# y5 ~% l" E3 b v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));
- u4 y/ L6 d5 W4 f9 ?1 Q% o# e % 更新去噪图像矩阵
. w# L) k) \/ z M, I# N6 W* V3 y u = u+w.*v;
0 W, }# _/ I+ E; r$ X % 更新权值去噪图像矩阵" o6 c* t* x1 d/ a
M = max(M,w);. ^, b- z+ Z. D! ~5 d1 g" Z" q
% 更新叠加权值 accumlated weights! y- H6 `0 q; X
Z = Z+w;+ B: Z0 s0 e% x9 f
end' A( J. p8 }$ X2 }5 i
end
& ?. u2 f$ ]. _: _) E4 A% \end
1 K) T6 m; X, J$ E5 r0 k5 e3 D) f& o% 重构图像
; C3 q1 [6 M9 Tf = 1;& E4 }' v# D% {/ w9 [- a
u = u+f*M.*Nimg;7 U6 T9 y% V7 ?/ w- C( r" U
u = u./(Z+f*M);+ n+ f" k0 ^" u* C+ U
DeNimg = u; % 重构去噪图像( F2 W' p% p7 f! F% D
; d( S4 W) R* J0 b9 F+ [function Sd = integral_img(v,dx,dy)# p5 F2 ~! Z. N+ b8 Q! B$ `7 J
% 根据平方差,插值图像
1 V/ J5 {0 T$ |7 M. G' T5 f* m% 变换计算:tx = vx+dx; ty = vy+dy
# o# B2 H+ G; a0 i9 Yt = img_Shift(v,dx,dy);/ u* }: V# ~4 g0 E# ]
% 平方差图像
' \- J1 J4 u" t% N* v, R& s. m! \diff = (v-t).^2;1 Z/ ^2 H0 H P! y" _# E
% 沿行插值
+ e W% z4 u9 ?- \" Y5 QSd = cumsum(diff,1); % 行叠加" s' j# x* O# D# b* V: l6 s
% 沿列插值
! J3 ~* V) N) O5 \& ESd = cumsum(Sd,2); % 列叠加
9 ^1 c, l% W0 d$ @6 D+ `
! J+ C( j0 f* _) m( Wfunction t = img_Shift(v,dx,dy)8 l0 e+ f, w2 q$ ?& g' R
% 在xy坐标系下,进行图像变换操作3 ^- I" s5 p9 _4 s
t = zeros(size(v));/ H) y9 B3 C( p$ ]( q
type = (dx>0)*2+(dy>0);) m" S; T, V# u3 d
switch type
, |5 V) g3 T5 ~9 S% h0 P7 h9 q" H case 0 % dx<0,dy<0: 向右下方移动' K. ?7 S* z! M o
t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
1 M' z8 ~5 E, H8 `. k case 1 % dx<0,dy>0: 向左下方移动
+ k8 `, S" k. o- K3 _ t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
, a; M9 U) z0 T3 K+ B case 2 % dx>0,dy<0: 向右上方移动
4 t" s7 i, u$ U. p; e, a t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);
8 s; p5 K2 Q0 A7 \( f' @ case 3 % dx>0,dy>0: 向左上方移动( r4 N, N( L, f/ F5 y2 S I
t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);8 D. h) T$ \ ?4 ^/ q( E
end$ }$ O' T6 P9 p9 I
|
|