TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用
- R. r; @5 _) C$ ]5 v
3 n4 F' a: X, S3 E& |2 x# p! Jfunction DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
, W7 I7 W! X ^8 \7 A) z% Non_Local_Means滤波器
. r' Z! a; T6 m& {%函数输入:
1 K0 m" t1 l9 Y* }- V% Nimg: 输入的图像矩阵 + 带噪声的
6 Q4 o4 R- J! d5 N4 ^& B) I; z2 f8 r% PSH: 扩展窗尺寸大小
Z4 X* `$ n6 b; h Z3 E3 r6 @1 ?% WSH: 窗尺寸大小1 i6 m3 I8 A: B" c
% Sigma:方差3 R/ P/ l6 ]; {+ f7 x
%函数输出:
J" z8 V8 X: [0 p$ H9 o% DeNimg: 重构滤波图像9 {0 z" b/ [; w$ a' I/ W( ]
1 K7 w! |2 e+ d/ eif ~isa(Nimg,'double'); d" [8 F3 l) o% K# O
Nimg = double(Nimg)/255;6 q9 |1 r E1 H- ]) u
end! X# Q, o- x/ T3 e, U* d6 {4 z+ F
4 n* l5 \3 k9 x# R0 Q8 s; p1 s% 图像维数) w# ?8 }1 z5 a0 k# D& d+ L
[Height,Width] = size(Nimg);+ F) q: o2 ^0 t, |( f& \2 i1 u( k! `+ E
u = zeros(Height,Width); % 初始化去噪图像矩阵0 J x" }. N) S5 N. y: b; X
M = u; % 初始化权值矩阵
# d5 E; [/ o' H. lZ = M; % 初始化叠加权值 accumlated weights
& R9 {( [. l. M% T4 A* T7 N% 避免边界效应
9 I* w& V4 w2 t9 _# SPP = padarray(Nimg,[PSH,PSH],'symmetric','both');
! {# T6 y8 D4 l2 u1 r1 VPW = padarray(Nimg,[WSH,WSH],'symmetric','both');' E4 s( s& j) K9 H* O5 }& X
% padarray使用" a6 h# p4 ]# |# i0 _
% A =' S2 v2 Q- k" H: }; [1 J9 O% Q h
% 1 3 4
3 k+ F. s* D/ |0 x% y% 2 3 4
/ L" k- [. f& {# H% 3 4 5
3 w+ m2 H6 f/ ]4 S5 g% r% B = padarray(A, 2 * [1 1], 0, 'both')$ n4 ~& |7 f1 f
% 0 0 0 0 0 0 0
' v8 }# I2 a4 S9 F: M! Y% 0 0 0 0 0 0 00 v5 H, ]. ]! m
% 0 0 1 3 4 0 0
: u, }3 g; P2 s2 R* Q% 0 0 2 3 4 0 0
3 e: c4 h& L/ r! a: h9 z" B% 0 0 3 4 5 0 0
' M. s& |1 W4 P' h$ ?" \: G% 0 0 0 0 0 0 0 b3 o4 m, I6 [" F! ^
% 0 0 0 0 0 0 0' ~* z& c6 k8 I# |/ U. v
% 主循环
$ o, E6 ~% R5 e# b# @$ [for dx = -WSH:WSH
4 Z4 x0 O( d0 r' r+ A4 V% | for dy = -WSH:WSH% T/ m2 E% P$ I* L
if dx ~= 0 || dy ~= 0
0 |& Z% L; ]" y, w5 C/ ? Sd = integral_img(PP,dx,dy); % 插值图像
5 X0 H4 S/ K; b7 _* Z2 J, i* k) { h % 获取对应像素点的平方差矩阵
% V: c7 d+ S) ] 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); N7 v6 Y# x0 f/ v3 \
% 计算每一个像素点的权值+ i& b# B, n& u, g! _; Z# M0 t
w = exp(-SDist/(2*Sigma^2));. ]" b$ f) U) i, u$ A
% 得到相应的噪声点
* Z- k$ U3 b- | v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));: Q7 t$ ]1 W5 o7 d) v
% 更新去噪图像矩阵
: U- u1 z* U/ v! a u = u+w.*v;8 ] s: Y& Q9 w! e( D: H
% 更新权值去噪图像矩阵
( U! h- }* |- g M = max(M,w);8 ~3 e P, o; z0 n* {# [
% 更新叠加权值 accumlated weights
; ^# V' }9 b* A; L' s5 q, g6 A Z = Z+w;
$ J y/ }0 o1 n3 g# A end
: I% l( z+ y- N% r6 A! M: K end
8 R$ B$ }$ d8 x8 a6 T4 H% Cend
: l5 @# _5 ]" {# h7 ]% 重构图像
7 p0 c m/ n2 b* H8 |- Uf = 1;
3 P* T6 h* u- z: Zu = u+f*M.*Nimg;
. [# V) C* l+ f3 u& _! \" Wu = u./(Z+f*M);6 c0 I4 P2 A# r5 H- o; K
DeNimg = u; % 重构去噪图像; k" D) \2 \; b: l
0 p+ c4 u- z) n+ ]% @5 j8 _function Sd = integral_img(v,dx,dy)- @( e% ~; W8 u
% 根据平方差,插值图像
6 q# R" T) d. K0 r& _! X4 {% 变换计算:tx = vx+dx; ty = vy+dy
4 ^, h" C" ^7 J4 et = img_Shift(v,dx,dy);
, c9 G4 X, c% Y. {) w5 I% 平方差图像
7 t' h6 W1 K3 J5 b) _diff = (v-t).^2;# `( j" j" ?$ h2 k# B9 D
% 沿行插值% A; A; D8 L1 l
Sd = cumsum(diff,1); % 行叠加' I2 u" b3 Z$ y6 z# r* A( K
% 沿列插值# j/ a' L! Z9 _; X
Sd = cumsum(Sd,2); % 列叠加( \7 ]8 ?% U" [% G- l0 B
# a/ K- B- c% y2 o# o: O( y5 Kfunction t = img_Shift(v,dx,dy)& P: ~6 q, ^3 Z1 ]. @. @& f _8 h
% 在xy坐标系下,进行图像变换操作
2 V) d4 m5 }- w- a& {% b+ k! ^t = zeros(size(v));* {, m5 s6 B/ t+ L) e3 r
type = (dx>0)*2+(dy>0);5 i+ X- X1 q C1 x2 U3 }6 L
switch type, l8 u& m& a- Q8 n# j/ ~. H7 E
case 0 % dx<0,dy<0: 向右下方移动
: t. H( q F! W, Z. s( M t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);* b3 J% i: y" E: G }0 o
case 1 % dx<0,dy>0: 向左下方移动
* E+ D" ~0 P) R0 o( M t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);& d9 ~4 t9 o" h* {! y
case 2 % dx>0,dy<0: 向右上方移动2 N' F4 l$ Z1 u
t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);$ e, K9 ^/ R" Q- e' H
case 3 % dx>0,dy>0: 向左上方移动' S9 S' ~7 g7 m; E# |6 g# D
t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);
1 J* w' q$ j9 o6 B1 uend; u8 T& Y5 \, I a1 e7 D
|
|