TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用
G/ Q B0 }2 b( `. G5 e7 t
3 R% X2 P% d# c7 {, {function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)
8 Y' \; r) e$ s1 |% Non_Local_Means滤波器9 i+ C W! G, ]/ _6 d* a
%函数输入:
# ~! U" n2 \% N% Nimg: 输入的图像矩阵 + 带噪声的
( H$ }% e, k- a# N1 g% PSH: 扩展窗尺寸大小
! s- ~; m/ N9 N" k/ Q% WSH: 窗尺寸大小- r& Q6 k6 Y8 k' o
% Sigma:方差
E: s5 `( `$ }# }2 K%函数输出:
8 f1 X: }1 p) a( O2 d9 P: @% DeNimg: 重构滤波图像: n' x% H i& L2 l% S
* G8 S- ` { P6 _if ~isa(Nimg,'double')( Y+ P0 f5 f9 o9 q: f
Nimg = double(Nimg)/255;
g0 s, W' K2 Iend
2 [* o! A$ E# L, G) U
6 v& U# X, l f: O% ^% 图像维数9 M7 t: u* [) f% |) g* B
[Height,Width] = size(Nimg);
5 c p3 k$ m9 pu = zeros(Height,Width); % 初始化去噪图像矩阵
- R9 V9 o% y" Q$ w8 ^* ~M = u; % 初始化权值矩阵
+ C7 B0 I- L9 F# cZ = M; % 初始化叠加权值 accumlated weights; O+ y% A0 B5 |5 e$ z3 A
% 避免边界效应6 e' j5 r$ ~0 X5 M
PP = padarray(Nimg,[PSH,PSH],'symmetric','both');
- k* q" n4 f( s LPW = padarray(Nimg,[WSH,WSH],'symmetric','both');: ]7 Q8 q; c9 [) y- w
% padarray使用
" N9 A$ ^; Y I& F& D$ ?% A =
; s: E1 w, C6 S( T% 1 3 4; Q. T- f/ Y+ l4 L% E0 b
% 2 3 4
4 u% ~) l, X* Q) y. S5 [7 P# j9 T2 E5 p. R% 3 4 5& G7 ?+ \ G( G$ P
% B = padarray(A, 2 * [1 1], 0, 'both')
: r, }6 t; w _% 0 0 0 0 0 0 0
& r! x4 f% l) G P" i- p3 D0 Y3 ^% 0 0 0 0 0 0 0! N& s R+ L0 a' d. y% m0 [
% 0 0 1 3 4 0 0
$ x( u/ w, `" e/ G0 G+ @% 0 0 2 3 4 0 03 W4 K: k0 b) K. _4 E a- x
% 0 0 3 4 5 0 0
`+ X5 _! r/ f% 0 0 0 0 0 0 0. k, X, G3 g4 T- m& ^2 P1 Y
% 0 0 0 0 0 0 0
, n/ x1 x/ a+ E/ x& p* M% 主循环& F: S! W" p6 u
for dx = -WSH:WSH
5 n6 k, M: ~4 q! G- {, @8 Q4 S+ C for dy = -WSH:WSH
) w! d+ ?. A) P1 s if dx ~= 0 || dy ~= 0
3 {6 B; l1 U8 w$ G Sd = integral_img(PP,dx,dy); % 插值图像
U! S- [% S+ Q' K! K % 获取对应像素点的平方差矩阵* A) J3 X' D5 l1 F
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);
% N' t' U5 z, w$ V; Y6 J/ }& k % 计算每一个像素点的权值
9 S {7 b: K8 }8 t5 { w = exp(-SDist/(2*Sigma^2));7 w* h% v2 x$ y1 D0 {9 C" H& M
% 得到相应的噪声点& ^, V" r0 h0 V I0 [8 B
v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));/ W1 Q6 \) K; v4 y1 a
% 更新去噪图像矩阵
. q) i: h( O2 m/ ^+ P u = u+w.*v;$ F% L2 b* G3 O' X. M
% 更新权值去噪图像矩阵
" o X1 [* K) s7 [) M# O, D( ` M = max(M,w);
; Y1 z' [+ @) W % 更新叠加权值 accumlated weights
/ ]+ n9 N$ f- m# P$ t3 j8 a; v Z = Z+w;" P) \6 J a% \8 j, V$ W4 g
end8 Q. D+ x4 D4 `% E0 f4 F: u8 L
end, B. G# a. T& g
end
% k$ k9 x- f0 o9 r q# [) g8 \% 重构图像
6 o$ b8 H4 w3 e& p5 x* T$ ]f = 1;, n! T) ]* h) A) o
u = u+f*M.*Nimg;
3 s8 b% A+ S( j8 h tu = u./(Z+f*M);
8 k0 Y5 K# i4 Z j! ?. f- tDeNimg = u; % 重构去噪图像
& d' h* p5 N( l3 l
8 c( v$ @+ ]: Y. z* Lfunction Sd = integral_img(v,dx,dy)
: L; {6 A1 `0 h0 e6 ]; J5 v1 `% 根据平方差,插值图像
# `/ E3 Y8 ]# i, C% 变换计算:tx = vx+dx; ty = vy+dy
+ w8 `; @) \# M2 Dt = img_Shift(v,dx,dy);
2 W3 p [6 C0 r( Q" O% 平方差图像; \: X: g+ @. A/ L9 o
diff = (v-t).^2;
* J1 T) q+ e8 `* |) \+ L3 _0 {* ^- m' |) L% 沿行插值 U3 r2 g5 \1 D& o; K; c2 A
Sd = cumsum(diff,1); % 行叠加
3 b8 g; H3 N5 Z! w# t% 沿列插值
8 X& Y: e5 H3 O' @% XSd = cumsum(Sd,2); % 列叠加6 X W Y9 L$ A( X* _+ F) T4 Q
0 H1 n0 x, y: j' S( P% z2 t( {
function t = img_Shift(v,dx,dy)5 F6 R1 Y0 z Y! Q3 F% Q9 c. |, Q
% 在xy坐标系下,进行图像变换操作
# M3 t- K" B+ B$ |/ l3 kt = zeros(size(v));8 {+ b5 }' M2 E1 ]" X' L1 k9 v
type = (dx>0)*2+(dy>0);, g' E4 A( R: ^8 j
switch type
8 x1 [5 X: v6 i6 G v case 0 % dx<0,dy<0: 向右下方移动
7 g: G5 u9 y& u7 {# h+ t t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
5 S3 l( z6 I }4 ^ case 1 % dx<0,dy>0: 向左下方移动
, ^* p: `6 H5 z9 F4 S% @$ T+ J2 g t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);# ?" b6 T& C6 R. K/ j
case 2 % dx>0,dy<0: 向右上方移动6 `8 d; X4 \. n/ F/ I [$ {
t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);
( @% f: T! T6 u; P- k- U case 3 % dx>0,dy>0: 向左上方移动) D$ v b2 ]1 ~8 i' P9 @
t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);$ k1 d7 n" _8 z5 I- Y0 ^* g
end# @" x, B& K) D; Y
|
|