TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用3 j5 O3 z$ ?2 `$ B. ^0 `
. x. d) q# n3 S( P# Z! m
function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
7 q" ]# Q/ N/ |: T( G' k# z% Non_Local_Means滤波器
; b5 S1 t* G7 W! c# R/ P' E. L( m%函数输入:
% Y9 K# N$ o3 J+ A% Nimg: 输入的图像矩阵 + 带噪声的
1 U/ ?; N6 i: n6 x% PSH: 扩展窗尺寸大小3 ~4 x6 d2 q! N' ]+ \
% WSH: 窗尺寸大小
' n' o8 o+ F% {( X% Sigma:方差
& o' l9 t2 j0 C( J%函数输出:
# U; B _. d- C* J/ `% DeNimg: 重构滤波图像9 a7 C- `# N4 I6 v% f* i" H
' ]4 F: A8 [, W0 r- @if ~isa(Nimg,'double')5 t* W, ` L$ s3 T
Nimg = double(Nimg)/255;7 g8 |4 R% M! E/ {0 r. B
end1 R- N6 M3 T; O, b8 i
7 y! B5 }+ I. ]1 Q H
% 图像维数
1 E% A5 H K! ?8 c' r) E% I[Height,Width] = size(Nimg);/ r' i4 v8 t" m
u = zeros(Height,Width); % 初始化去噪图像矩阵
3 J( o+ b/ I0 r. B, wM = u; % 初始化权值矩阵; u1 P$ ^ f% V% O- o h6 w/ L
Z = M; % 初始化叠加权值 accumlated weights
( L9 d: q4 ^" Y% J; _8 h& K% Q% 避免边界效应- c, n+ F# _- h# G
PP = padarray(Nimg,[PSH,PSH],'symmetric','both'); t" U" p' u) Q$ t& T
PW = padarray(Nimg,[WSH,WSH],'symmetric','both');$ s3 v$ P! z& t0 ]' j' n
% padarray使用
6 E$ _' w3 t0 m0 H# q" z3 V5 }% A =. j e9 F$ q* `' p% i" `
% 1 3 4. i& q |0 q! Q7 b) g
% 2 3 4; V* {/ U0 f! _7 d' k2 ]
% 3 4 5
# n5 F5 `4 J7 a2 k% B = padarray(A, 2 * [1 1], 0, 'both')% N q6 t4 Y1 C" U$ w
% 0 0 0 0 0 0 0
$ n& J9 w3 O. ^4 z1 {% 0 0 0 0 0 0 0& l( P# [# g5 ~( C+ J
% 0 0 1 3 4 0 0: C$ Y8 v- w& o
% 0 0 2 3 4 0 0
* ^% D! r( K& Q+ r% 0 0 3 4 5 0 0
" O' ~1 K; M/ |% 0 0 0 0 0 0 0' }% Q; c7 `2 x. v; k
% 0 0 0 0 0 0 0
+ n% a J$ ?# f9 _% p& R3 l% 主循环( ^/ \: W9 l4 Y! E
for dx = -WSH:WSH
6 R: b( }1 ?% X e for dy = -WSH:WSH& D. y# _: u; c3 U& i
if dx ~= 0 || dy ~= 09 J. n: ?# Z) W
Sd = integral_img(PP,dx,dy); % 插值图像
5 [9 Z/ P1 G5 M" U/ E % 获取对应像素点的平方差矩阵+ j, S" J5 Y% z% f2 v @6 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);
+ @; ]5 D4 z* N3 G % 计算每一个像素点的权值9 _. a9 v* W8 k
w = exp(-SDist/(2*Sigma^2));, n7 B5 q$ T' F5 e
% 得到相应的噪声点/ m# | U8 Q1 [7 N8 l
v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));
4 P( O0 e( M, }# W" |6 X % 更新去噪图像矩阵
- P- C0 P+ X. u- p u = u+w.*v;6 ^- F- B( Q+ z, P4 J
% 更新权值去噪图像矩阵
$ N( O2 F7 [; z7 ~ M = max(M,w);: r# F$ |; {/ o ]
% 更新叠加权值 accumlated weights
: b4 l8 p8 m0 Q0 N! r Z = Z+w;2 j0 h: ]: l7 B1 V* k. V
end
( u9 i0 i) f* L" {0 i+ c end { ]* K1 r d8 Q8 H2 _ M
end
) U& o; p, I9 k c4 S% 重构图像
6 B+ S: V3 i3 y6 ~. if = 1;& ]( W _% @* l( P3 U" S w
u = u+f*M.*Nimg;
/ F; _4 o; w. v# `% {& Uu = u./(Z+f*M);8 p( |6 t, ?0 a/ H6 x v, z
DeNimg = u; % 重构去噪图像
7 D5 e: I9 p; }( K% D# o4 u; X5 g; Y a
function Sd = integral_img(v,dx,dy). M* y# G2 `4 Z) R4 @
% 根据平方差,插值图像' W/ j# c! O& G) ~2 f
% 变换计算:tx = vx+dx; ty = vy+dy
! c$ @" K& m/ \, ot = img_Shift(v,dx,dy);
: t/ i" h/ ~& w3 `/ x& w4 w# f% 平方差图像9 Q" R; z2 v& F4 n
diff = (v-t).^2;8 X0 E2 d6 R" W" S+ o
% 沿行插值; t& m& }4 w2 T* m1 E1 @4 u9 g, Z
Sd = cumsum(diff,1); % 行叠加
& H3 Y9 e ^% D' o( x% 沿列插值
/ T. Z. o3 R; P* {6 RSd = cumsum(Sd,2); % 列叠加
$ ]1 m v5 Y( x6 c* A$ K. T1 Y: ] u: C& \5 K
function t = img_Shift(v,dx,dy)
1 O7 H+ N: C7 G+ d% 在xy坐标系下,进行图像变换操作5 y/ w0 {; T3 ^; Z
t = zeros(size(v));" i# W( g/ U) ^% C7 S3 `
type = (dx>0)*2+(dy>0);
" `! Q, A! H7 e' t3 I$ {8 E8 oswitch type) i# U b. {" r+ q( |
case 0 % dx<0,dy<0: 向右下方移动! S& ]4 k' a2 Y! j
t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
; J& M' l* @4 Y% L9 b, {/ D case 1 % dx<0,dy>0: 向左下方移动+ ~1 D5 l" U% c( J+ c/ ]
t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
+ h4 Q1 ]% Y" B7 q: D# J# k! z case 2 % dx>0,dy<0: 向右上方移动) E0 \: w" C$ D$ F. O" T
t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);
# y1 a) z8 e6 J! e6 N f* z case 3 % dx>0,dy>0: 向左上方移动
9 d/ p& o" H, g. n, ? H: ~; y t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);
7 J+ |7 {- q/ qend
. D0 ^% h5 Q f) M4 d) p. Q) F |
|