TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用6 c3 K6 _1 E& J. S- |8 j
a- N, W- P5 h; \" d1 g; Y8 m
function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
9 L8 T# e7 M) y; l$ ^4 h4 q% Non_Local_Means滤波器: H, c" h- d }- N' L; _) G0 a
%函数输入: * g3 N! j& K0 y/ e1 r+ ]
% Nimg: 输入的图像矩阵 + 带噪声的0 `' @1 M% h; k
% PSH: 扩展窗尺寸大小! {. J4 \! ]6 w u; w
% WSH: 窗尺寸大小
7 u1 b9 D% [% N5 S/ F g7 o# Z! c9 F% Sigma:方差
5 z8 j4 U+ |, `2 v%函数输出: 7 e4 _* p b! X+ ? d6 a
% DeNimg: 重构滤波图像# M5 `& ~0 N' G1 p
: x8 j( m+ G+ Y @: t3 ^
if ~isa(Nimg,'double'): l' J. J/ ~6 Z+ h7 H6 h( f
Nimg = double(Nimg)/255;
" U- \' l# G% O0 Fend
* A! e( t" j% e" o& J$ S+ U7 k! k1 L9 c$ ]# W& ^$ ]8 C
% 图像维数. v2 \+ r/ x% o7 y* K
[Height,Width] = size(Nimg);
/ ~4 o+ k q. r4 g8 {% _+ Eu = zeros(Height,Width); % 初始化去噪图像矩阵% }' d b' K# g0 j
M = u; % 初始化权值矩阵4 U; m& H* O% S" x) o9 v
Z = M; % 初始化叠加权值 accumlated weights
) _. I5 V$ {: v: h/ U% 避免边界效应
& y4 w) b& r. ?" D" _PP = padarray(Nimg,[PSH,PSH],'symmetric','both');
! v$ g! l6 U2 X: rPW = padarray(Nimg,[WSH,WSH],'symmetric','both');
& Z" Z+ \" ?) t5 \' ]. ~% padarray使用
6 Y. G8 o' U( ~; N4 x7 v% A =
+ q/ p7 K" d" C2 m$ q% 1 3 4
" s, `6 \0 A0 {6 F1 P% 2 3 4
- W1 Q6 o! e- r1 N! {% 3 4 53 N0 F% v( }4 R
% B = padarray(A, 2 * [1 1], 0, 'both')- ?6 ]. Y D8 o8 B* M8 X% x: J
% 0 0 0 0 0 0 0
9 b# f1 w+ N4 K6 s9 I% 0 0 0 0 0 0 0$ Z" E E+ |- o9 y, V$ w" m @ r
% 0 0 1 3 4 0 0, \7 N; X$ v' n
% 0 0 2 3 4 0 0
8 E* D) {3 ?0 D/ J6 Y9 J4 i) k% 0 0 3 4 5 0 0
2 A( I/ e/ c+ Q* e* A' r% 0 0 0 0 0 0 0( R0 C2 N1 I( L! J! B2 y0 C
% 0 0 0 0 0 0 0
& N! a3 e) N7 C7 J% 主循环% q' q) j% D/ ?6 y. W
for dx = -WSH:WSH
6 z& G6 u/ I( k, n& N for dy = -WSH:WSH7 M8 C; G/ y5 _* g0 j: e+ {2 h2 f
if dx ~= 0 || dy ~= 0
. {. B1 G# h9 _( O! B. U/ Q0 _ Sd = integral_img(PP,dx,dy); % 插值图像
2 \+ ~8 Y' X% C; r+ p- Z % 获取对应像素点的平方差矩阵
6 y1 p5 z4 U# I6 h3 b. 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);
5 [( [; w/ N+ T# I$ K% L % 计算每一个像素点的权值* f. M, I) b) J6 Q2 B& R* ]; A
w = exp(-SDist/(2*Sigma^2));7 a% W+ G- I6 t: l
% 得到相应的噪声点( E. x8 T- J0 ?- k+ O
v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));
3 d" C/ Z ]: X2 u % 更新去噪图像矩阵
8 l, \# \) X1 t! ~, ^& I- D u = u+w.*v;
2 E# B- i4 F& {. m: k V % 更新权值去噪图像矩阵, }# w6 M3 E! `/ j! |4 d. J. r3 P
M = max(M,w);! L& {7 w: ?/ t1 }
% 更新叠加权值 accumlated weights
, ^0 W3 U9 b) b Z = Z+w;4 {4 ?" T% a9 H6 [! i* |, T
end- W% w0 L8 s1 _, I! @. s) H
end
y8 n& J( H0 A9 F! ?2 |7 y- Eend# \% ]9 h0 M" |6 s, Z
% 重构图像 - L# B* O1 U+ q* @3 M1 \* Q9 Q
f = 1;
1 e( H9 ^7 R( r) j, l8 R2 x8 eu = u+f*M.*Nimg;) U3 i" a0 d. V) e2 t/ z
u = u./(Z+f*M);
: I. s8 W+ I. T% V3 f2 ?DeNimg = u; % 重构去噪图像
/ h! L& L J6 u, [+ r/ |( p( A9 t# W. ~; {6 y
function Sd = integral_img(v,dx,dy)3 C p4 X* F( t" {
% 根据平方差,插值图像
% {* ?# ~, q! R! K* M* l9 D% 变换计算:tx = vx+dx; ty = vy+dy9 b+ Z6 A* x7 P R: M
t = img_Shift(v,dx,dy);' c- ?* X7 @- I% g- \
% 平方差图像! ^5 L6 G# C/ \ i+ I
diff = (v-t).^2;, X. ^2 Z; z3 o/ H- A3 y! w1 f; t
% 沿行插值
8 Y1 G: \4 q- V# w% E; F2 O( sSd = cumsum(diff,1); % 行叠加; F) m# k' }* @3 `
% 沿列插值
7 s% @& w2 ~/ ^* \' x4 [4 T2 YSd = cumsum(Sd,2); % 列叠加0 K& \" `; r3 f% [7 k
) w' z7 x2 X, S% B& h1 W afunction t = img_Shift(v,dx,dy)
/ ~( P6 t+ k T$ }* J% 在xy坐标系下,进行图像变换操作! H- M; u7 O. i( T7 ]6 F$ E' U
t = zeros(size(v));/ M6 B: B! g P' W* `, L
type = (dx>0)*2+(dy>0);
9 K, t; y! w9 _9 Gswitch type
& u, q" K- L& ]6 ]. V2 F8 r case 0 % dx<0,dy<0: 向右下方移动
3 `. g& I M2 `$ x r& w; ] ?' q t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);, l1 ?" B! p* R" L$ \5 X* Z$ Q
case 1 % dx<0,dy>0: 向左下方移动
/ g1 | G$ z" Q& W* A9 V t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
* a! K) q) t, c( s. h/ M case 2 % dx>0,dy<0: 向右上方移动
. Z, R8 g7 V/ L( P* { t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);
9 s% V v1 O& d" [( r( Y" `$ I case 3 % dx>0,dy>0: 向左上方移动
" K2 u/ f! t. S t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);
2 e& m; t |) |5 S, K Jend
2 D f" d+ B9 q- u5 A |
|