TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用
( M f0 K A8 F2 ^# R8 u
5 O8 Q6 {8 m' e+ u' xfunction DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)% ?8 b0 A' u1 w
% Non_Local_Means滤波器
$ J$ J+ L3 {' g% w% J; p%函数输入: / q; g' v5 j' {
% Nimg: 输入的图像矩阵 + 带噪声的
) G y; m$ ?% C9 a3 J% PSH: 扩展窗尺寸大小
2 _( |5 a/ U' }- `* M% WSH: 窗尺寸大小
7 {0 ^4 `" S9 w% Sigma:方差
* b' x# @& y0 E. g+ k% Z$ o%函数输出:
" h- L5 W9 ~/ V# m8 }3 B, v% DeNimg: 重构滤波图像6 e: z7 Y0 X1 `; X, H: h. G
: x! F9 R# h) K
if ~isa(Nimg,'double')* \& a0 e, g& R* \
Nimg = double(Nimg)/255;
' ]* U' E" [2 Mend9 z& j2 W0 X5 P" c' D* ?$ H: k5 e
* z4 L$ ?( e0 o, `/ N% 图像维数0 {. }9 Q& f+ ]9 r
[Height,Width] = size(Nimg);
7 B1 [, O: I$ Y4 @7 a; n+ Eu = zeros(Height,Width); % 初始化去噪图像矩阵
2 n; J. o* p& _- ?) vM = u; % 初始化权值矩阵
$ \ v, X5 @' { NZ = M; % 初始化叠加权值 accumlated weights# X/ n0 {- z1 d4 r, @, {
% 避免边界效应3 S+ ~5 o* Z7 z3 a! `+ q: V- ^
PP = padarray(Nimg,[PSH,PSH],'symmetric','both');
$ A$ T" F4 R$ z# @0 g3 Q* ~( oPW = padarray(Nimg,[WSH,WSH],'symmetric','both');! t# A& K& v' v# B
% padarray使用" w! e) L, c6 ^5 R
% A =
# e0 v0 \0 J' Y% 1 3 4. u) X5 D1 w/ Q; i
% 2 3 4
. h& Q. o8 k# V. J; N+ T% 3 4 59 i! u! ~% _7 Z; M9 `
% B = padarray(A, 2 * [1 1], 0, 'both')# T* b/ K) O8 f! z7 I, x, w
% 0 0 0 0 0 0 0$ G6 E( p- Y; T% g
% 0 0 0 0 0 0 0
- [( M' s% c8 w" ~ d7 @% 0 0 1 3 4 0 09 n' j! b9 M7 p& f. F
% 0 0 2 3 4 0 0
4 B/ z5 k5 C4 Z( P4 Q, l1 s% 0 0 3 4 5 0 0
% _+ t0 X2 L0 h N% 0 0 0 0 0 0 0
/ j$ c( I, n+ M3 P$ g9 x) l% 0 0 0 0 0 0 0
9 c3 W7 ^" [2 g. G* [- p, F2 B% 主循环
! F9 d b" E/ S7 o2 {3 Wfor dx = -WSH:WSH0 h( j5 D; ^! e5 M
for dy = -WSH:WSH
0 t/ c: j4 T/ y if dx ~= 0 || dy ~= 0, }6 l' G- t8 M' t0 D7 D! i+ Y
Sd = integral_img(PP,dx,dy); % 插值图像
6 G+ e* E- V3 i | % 获取对应像素点的平方差矩阵3 H4 e- [' }# _" Z$ D
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); ! B% }7 R) D$ v2 u% Z
% 计算每一个像素点的权值, l# O' n; q; i/ q3 O
w = exp(-SDist/(2*Sigma^2));& A( ]8 s( d% p6 k' S) ]4 x
% 得到相应的噪声点
" z' i# h- r J& A v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));
, X9 s+ _: D+ ^7 ?* Y* f % 更新去噪图像矩阵
( ~2 n! u4 U! @: R u = u+w.*v;( {+ j+ ]$ O7 ~( F& w& X
% 更新权值去噪图像矩阵9 E# Q& O. n# K) i3 Q9 R" L2 U9 j
M = max(M,w);
, k2 s& D4 f4 \ % 更新叠加权值 accumlated weights5 g4 V; ?& y& `5 q# K
Z = Z+w;5 C/ Y1 d1 E; `1 w8 R( u
end
: u) g, d- I3 @4 M" b end
9 M* E8 Z( S: Z: u, f9 y+ x: i2 nend, P; ?1 T: [. ?* o; ?/ M4 ]; ^
% 重构图像 ' r; y. v9 _/ e
f = 1;' p$ y8 K" w5 ~ u$ r, p
u = u+f*M.*Nimg;
0 j; q0 t' u c$ K7 wu = u./(Z+f*M);
9 I2 N0 H* k( y |DeNimg = u; % 重构去噪图像
8 k" E' [2 t K- L6 Q. O9 }; C3 V8 s
function Sd = integral_img(v,dx,dy)
/ A# A o: p8 o, f% 根据平方差,插值图像& ]# @4 Z: ^1 m+ X% S0 O' q$ _$ s
% 变换计算:tx = vx+dx; ty = vy+dy
( v& d+ m2 L' et = img_Shift(v,dx,dy);
& B' b# s; n. `9 B+ d. U% 平方差图像
0 _$ e& N& d- P0 s$ Pdiff = (v-t).^2;
, M5 ~1 |+ F+ V e, q! u- O' E6 X% 沿行插值
: t' o7 X) j# R: g$ d H) w0 CSd = cumsum(diff,1); % 行叠加
# u& B" X% v" N1 I" ^1 w7 l% 沿列插值" ?2 _4 C$ b- N" v
Sd = cumsum(Sd,2); % 列叠加" \+ l0 t8 j; X1 G; ^8 U
; V3 e4 W3 n* A3 l8 n
function t = img_Shift(v,dx,dy) |: X1 X, | l1 Q# g, }
% 在xy坐标系下,进行图像变换操作) t& q2 o8 R2 @- m* H
t = zeros(size(v));% O8 ~, P' Q+ F
type = (dx>0)*2+(dy>0);" a8 M X9 x3 E- K
switch type% l4 I* x" \' e3 V2 f, Z/ E
case 0 % dx<0,dy<0: 向右下方移动
7 Z$ R1 D( C) [2 s* H t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
. m3 G" P$ a Z7 ]$ R case 1 % dx<0,dy>0: 向左下方移动2 K. I5 O6 c) Q1 B% z
t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
/ d% Q5 c5 b2 s case 2 % dx>0,dy<0: 向右上方移动7 i( }- ~4 L- ?$ L' h7 E1 B
t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);6 M, q9 Y( B+ J9 I/ e
case 3 % dx>0,dy>0: 向左上方移动; G: h; q% X0 \( \% K* T( i
t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);7 E+ W/ h3 ?, E% t6 f5 m P
end( L* p. H0 P, S# @
|
|