TA的每日心情 | 怒 2019-11-20 15:22 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
分享这个源代码,应该有用% \ W8 i5 F3 I' x" w
9 m6 `+ ? E) _. j; I- Z8 n
function DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma)+ E4 y* J8 _: a0 A1 Q2 Y* h W1 T% k
% Non_Local_Means滤波器
. k( g n* Y% `& I& f%函数输入:
9 B( \% y" ]/ i: s% Nimg: 输入的图像矩阵 + 带噪声的
9 Y; ^/ [( X" R. k/ F5 [: X/ c% PSH: 扩展窗尺寸大小
4 z9 m' a+ l- V$ `% WSH: 窗尺寸大小; F& F6 C5 O5 n
% Sigma:方差
& }* Z5 r3 P6 |) E%函数输出:
% r8 N5 f' D2 Y% DeNimg: 重构滤波图像) C1 r- K( [7 ^3 }# Y5 P
0 ?4 A% f/ e; H
if ~isa(Nimg,'double')
( n$ @- x1 q i! [ a6 R5 y Nimg = double(Nimg)/255;
% l- R2 t) Z8 d7 _end
* ~1 A6 k' X* l& I8 [6 p1 o. q+ B+ n1 ^. \
% 图像维数/ K" w, S5 m7 x/ e
[Height,Width] = size(Nimg);/ o$ P& t7 S, H% s+ Z! l; B; I
u = zeros(Height,Width); % 初始化去噪图像矩阵
/ b8 s7 B; \) a" X9 O0 D; I) v$ BM = u; % 初始化权值矩阵& ~5 Y, D! N8 A$ R! E! ]9 M
Z = M; % 初始化叠加权值 accumlated weights+ `) [# ^/ ^1 O
% 避免边界效应
8 `! E9 J- f7 _ w7 o/ {1 _PP = padarray(Nimg,[PSH,PSH],'symmetric','both');: `( W, x I5 x. h# k; C8 b
PW = padarray(Nimg,[WSH,WSH],'symmetric','both');
# a) O9 M! w# X& b% i% padarray使用
6 B& j Y2 R( ?/ V) t% A = P; R0 m* R) k" G
% 1 3 4* T) U: ~+ C5 c8 ^ v
% 2 3 4
* W% W& k4 K3 V5 J( ]: A& e; x2 B- w% 3 4 50 g$ Z1 G; t9 F6 r& I) D
% B = padarray(A, 2 * [1 1], 0, 'both')6 c' I# R2 I, i% C) k
% 0 0 0 0 0 0 0
2 B! z( c4 r$ k3 i% 0 0 0 0 0 0 0
8 ^0 B/ p ^' Z* s9 r8 q% 0 0 1 3 4 0 0& H* t% G7 h. ]& _+ ?) h9 a. h3 @& p
% 0 0 2 3 4 0 09 m! n5 Z4 ]) o% v4 V
% 0 0 3 4 5 0 0& ?) U X5 a$ Y2 d3 d* f
% 0 0 0 0 0 0 0
% F5 H" F! s- G7 [! H. T% 0 0 0 0 0 0 0: R& y; `) |. e# d+ x& z$ a) C
% 主循环
: f7 I+ @0 d3 C1 M$ k' b4 |for dx = -WSH:WSH
5 V1 I8 \$ M |/ @$ [% v for dy = -WSH:WSH
+ \7 S/ U y# w7 p6 Q" ~ if dx ~= 0 || dy ~= 0" E! B7 @, U: g5 z1 ~6 z0 J; u
Sd = integral_img(PP,dx,dy); % 插值图像
7 N, N; e3 T3 Q! K, R- L % 获取对应像素点的平方差矩阵0 H8 W& G: `; g; [6 x* d. 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);
. P: S7 J4 N# h# k0 J( Z+ m4 \' | % 计算每一个像素点的权值+ {( |* x" ^7 z$ ^* ^
w = exp(-SDist/(2*Sigma^2));$ Q$ i: M5 l5 h$ ]9 P1 q8 f+ `; Y. Z" @( ~6 q
% 得到相应的噪声点4 z6 Q$ E3 f# G9 g$ E$ G5 B
v = PW((WSH+1+dx) WSH+dx+Height),(WSH+1+dy) WSH+dy+Width));4 f5 _/ {# X3 b+ K* W9 i
% 更新去噪图像矩阵6 L. {4 L5 E% P3 X
u = u+w.*v;
( s6 h3 ^7 P m2 } a4 K % 更新权值去噪图像矩阵
% J- D8 a" O0 [+ ~; Q$ O M = max(M,w);
% B# T: p" z2 l" t* q5 O: k( F6 A % 更新叠加权值 accumlated weights) a' N! M. ]6 {( C7 i1 Y" r6 C0 F
Z = Z+w;
6 ^8 v$ L% ]5 ^. A! [+ U; W) ~ end3 _1 _1 f& f/ t* w9 n& |
end
- P3 p/ P9 g! `$ L& kend
4 w& a; F6 p$ a1 O: c$ Z% 重构图像
& n: @* u: [0 ?8 T. D2 Df = 1;
& o3 K/ v8 {1 S- @8 Gu = u+f*M.*Nimg;
" p! @) ]; u1 M+ Vu = u./(Z+f*M);
+ ~; a. v1 A1 b$ A+ v, U8 r+ jDeNimg = u; % 重构去噪图像
7 d' r" Z: K: {6 l2 ?: W, B' x/ } \6 J" h
function Sd = integral_img(v,dx,dy)8 {' P! t5 I5 Y
% 根据平方差,插值图像
: Z+ B! M8 \: k9 Z i% 变换计算:tx = vx+dx; ty = vy+dy: V, h: _7 I: x8 o" l
t = img_Shift(v,dx,dy);: @# Y9 ^% T) }/ k7 P: s
% 平方差图像! E" V* {5 E* j6 ]& J- f
diff = (v-t).^2;
7 B, @6 \4 O. _ x: Q; Y8 O% 沿行插值
( y5 T$ U! `$ d/ j. XSd = cumsum(diff,1); % 行叠加
. i2 c; B! r& a9 z6 u8 E% 沿列插值/ x( |0 e) R- W5 T3 T* |- V J
Sd = cumsum(Sd,2); % 列叠加+ M1 \0 x, f8 {# ~
$ A4 E7 i+ u% P
function t = img_Shift(v,dx,dy). n$ m. F. X" A o" W
% 在xy坐标系下,进行图像变换操作
) X* j- N2 u" ~t = zeros(size(v));
+ m) X! e; P4 E* Ytype = (dx>0)*2+(dy>0);
2 M* X2 @: c ~) G0 ~switch type% t* K) f* q" H6 ^
case 0 % dx<0,dy<0: 向右下方移动7 u1 w5 N7 m# s: {) e$ h5 X& F
t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);
* U# \8 n/ w' A7 y" s! B case 1 % dx<0,dy>0: 向左下方移动# ~; v$ M; x4 L$ X5 x
t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);! }; l6 F! }) J: x O/ r
case 2 % dx>0,dy<0: 向右上方移动; I+ p+ i. a. t& h' ^
t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);
7 a9 \8 a# _# W5 z) N case 3 % dx>0,dy>0: 向左上方移动
0 N5 \2 k; N" \: Y" ^. f, r* H t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);" m8 l' ~$ i% t- s1 y% C
end9 @+ E3 O% ]. a) M4 p/ L
|
|