EDA365电子论坛网

标题: 求助:关于非局部均值滤波程序的问题 [打印本页]

作者: qUzalq    时间: 2020-8-28 14:36
标题: 求助:关于非局部均值滤波程序的问题
% 沿行插值
( f. B  Z0 |; D3 X0 g5 u# lSd = cumsum(diff,1);  % 行叠加) X( P! v8 S% u2 c
% 沿列插值
' z. ~1 a- F7 O# ISd = cumsum(Sd,2);    % 列叠加
9 K6 p7 t9 ]0 g9 j; W% U' p% A为什么要进行叠加?
0 Q. c, E* U+ l9 q4 {6 `7 u9 v  {( o/ f还有这一步也不是很明白,怎么就得到每个像素点的权值了
  ]" e6 \! E( ~! [            SqDist = Sd(PatchSizeHalf+1:end-PatchSizeHalf,PatchSizeHalf+1:end-PatchSizeHalf)+Sd(1:end-2*PatchSizeHalf,1:end-2*PatchSizeHalf)-Sd(1:end-2*PatchSizeHalf,PatchSizeHalf+1:end-PatchSizeHalf)-Sd(PatchSizeHalf+1:end-PatchSizeHalf,1:end-2*PatchSizeHalf);+ m# q/ P4 G$ x

作者: NingW    时间: 2020-8-28 15:59
路过
作者: mutougeda    时间: 2020-8-28 16:00
分享这个源代码,应该有用
8 ~* g6 a3 q, A! r& c+ g  U8 z9 v) Y' K
' E- G( \6 J5 b5 Y0 gfunction DeNimg = Non_Local_Means(Nimg,PSH,WSH,Sigma). D, l1 c. p& b8 K9 R
% Non_Local_Means滤波器
2 G/ U" u  E' e2 Y# n%函数输入:
6 |2 Y! C, x( J, }%         Nimg:  输入的图像矩阵 + 带噪声的
0 N# {/ t8 ~6 `% F/ s! E# g%         PSH:  扩展窗尺寸大小
& G9 r0 s0 |+ V# y% N9 B3 s6 C%         WSH: 窗尺寸大小
: x/ @# i# y7 V& ~2 [%         Sigma:方差1 X/ R+ s. C+ u+ q! P
%函数输出:
; U6 u& y$ n& I* K  @) `' R%         DeNimg: 重构滤波图像
( `0 U' l+ Z: y* p1 e- p
( Q) q/ ]3 ?7 Y2 ?* P+ Uif ~isa(Nimg,'double'). r6 a! o, [- @1 W
    Nimg = double(Nimg)/255;+ K0 Y0 m, m: E
end, X8 ?8 x/ w* q4 a. Z' K8 Z7 T1 m
2 {- z3 d& d3 V
% 图像维数
, p+ {' e" \6 E' z3 M[Height,Width] = size(Nimg);! |& l, x. Z% F/ n' j! S
u = zeros(Height,Width); % 初始化去噪图像矩阵) d0 ^5 l% _$ U" w
M = u; % 初始化权值矩阵
: `7 O* {# \( h4 a; f8 BZ = M; % 初始化叠加权值 accumlated weights4 e& W: k6 J6 v& _
% 避免边界效应) C* ]/ v0 `' J( C- O8 X6 ^7 `
PP = padarray(Nimg,[PSH,PSH],'symmetric','both');
0 U) Z, j# ]- [; F) |PW = padarray(Nimg,[WSH,WSH],'symmetric','both');
7 h4 K: [+ O* m0 ~. W+ o% padarray使用( m8 d) X' N, P
% A =5 W- ^- k# c+ c) R/ v7 }
%      1     3     4/ P1 M8 U. D* M4 D5 V) ?! U" o8 x
%      2     3     40 p- s7 k+ m3 i# e' u4 m2 a/ b5 z
%      3     4     53 s* |5 _% q; S; A$ ]
% B = padarray(A, 2 * [1 1], 0, 'both')" M8 @3 W5 `0 X8 u2 d; L1 A$ q
%      0     0     0     0     0     0     0
0 e: j0 C6 |( Y, y. \; L9 b+ Q%      0     0     0     0     0     0     0
0 ?4 f- b+ @& p5 B( K- Y- i%      0     0     1     3     4     0     0! s& d1 c0 l$ C
%      0     0     2     3     4     0     0( ~8 `  a6 S8 X. e' t  N* a
%      0     0     3     4     5     0     0# T! }8 \2 H- s
%      0     0     0     0     0     0     0
  {$ X8 D! ^/ ?3 E+ Z9 s( P. g%      0     0     0     0     0     0     0. r/ _9 y) T6 F) F% h9 N* |
% 主循环
( @. V. Y) Y: Y* B5 n! x! b& Pfor dx = -WSH:WSH
& Y, d! Q9 \$ }    for dy = -WSH:WSH& }1 [: z* b9 H- R4 k  S8 x" z; `
        if dx ~= 0 || dy ~= 0. R" A. F% }- N9 ~& J% {, M
            Sd = integral_img(PP,dx,dy);  % 插值图像' |$ ~- k3 |% N
            % 获取对应像素点的平方差矩阵3 c6 q; ~3 G3 n0 z
            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);       4 C2 P9 c' n& e- }# S
            % 计算每一个像素点的权值+ G) B8 D4 Y1 r
            w = exp(-SDist/(2*Sigma^2));7 v! r8 F2 c" m/ y& n
            % 得到相应的噪声点
3 }  f( K  T5 v# z2 X% _            v = PW((WSH+1+dx)WSH+dx+Height),(WSH+1+dy)WSH+dy+Width));, l/ ~+ `* a7 n9 U; V5 G
            % 更新去噪图像矩阵
3 [2 L/ Y' a( j& v* s: H            u = u+w.*v;
9 s; S/ B) Y7 Z# K; O! W            % 更新权值去噪图像矩阵
/ a$ d6 E1 I, x) X# C9 V            M = max(M,w);
5 R) C0 L8 Y" B* X( k1 z6 Y6 @            % 更新叠加权值 accumlated weights  E0 C2 K# T# `2 s$ V
            Z = Z+w;
; n, U7 q4 v% d3 u        end# i: a- K9 E- M8 e+ ^
    end
2 Y1 g2 B/ e3 Wend
0 d) N, I1 Q$ |8 D( q1 {: U+ w, w% 重构图像        ! E0 M  ~9 f$ ~/ {$ b
f = 1;
' z% F: L0 s" K0 [) ou = u+f*M.*Nimg;( `4 ~( y: u, [6 Y/ c0 L
u = u./(Z+f*M);
& X, G' y8 R0 [! bDeNimg = u; % 重构去噪图像6 S  i1 P; _' @0 W

; v3 o' @5 M( L: V; ^function Sd = integral_img(v,dx,dy)+ ]3 C4 z: W/ W" B3 y: d2 ^
% 根据平方差,插值图像8 @7 `4 c, t( }* s3 R
% 变换计算:tx = vx+dx; ty = vy+dy
- ?: H( q8 U+ }) p( E! ?t = img_Shift(v,dx,dy);
3 U. o7 C  v9 h2 N* i0 G% 平方差图像
+ N" ?2 r2 R. R2 c1 @$ ?7 _diff = (v-t).^2;
# w) @, g- ]$ X9 s2 x% 沿行插值
' C1 U- l. Y3 N$ W" kSd = cumsum(diff,1);  % 行叠加
( s. k  n# D9 t! F% 沿列插值
! W0 |% |$ t# t7 nSd = cumsum(Sd,2);    % 列叠加
* A& N- a4 T& q  W  H5 S6 V0 V6 H" R% Y. c/ i
function t = img_Shift(v,dx,dy)  \0 ?0 x8 w3 j) D0 ~! O
% 在xy坐标系下,进行图像变换操作- C+ {7 M( ?: O
t = zeros(size(v));- }& N, F, B* P8 Y- ~1 l6 r# S! Y0 _
type = (dx>0)*2+(dy>0);* u1 p7 U/ S7 }& C) I5 W
switch type
" B& T+ V' v1 I1 h! r" G    case 0 % dx<0,dy<0: 向右下方移动  d. k0 R; j# @9 u
        t(-dx+1:end,-dy+1:end) = v(1:end+dx,1:end+dy);. l; D: @" w& {+ e
    case 1 % dx<0,dy>0: 向左下方移动6 e, q% g( q0 U8 G4 P
        t(-dx+1:end,1:end-dy) = v(1:end+dx,dy+1:end);
8 A( l. `9 O# K    case 2 % dx>0,dy<0: 向右上方移动
3 ~1 K* [6 r: J7 X9 |  _% \6 W        t(1:end-dx,-dy+1:end) = v(dx+1:end,1:end+dy);/ s8 J* e/ p9 k4 i: F
    case 3 % dx>0,dy>0: 向左上方移动
# W" U8 S1 e9 _8 m" G) w        t(1:end-dx,1:end-dy) = v(dx+1:end,dy+1:end);
  x3 S, X! n+ p1 jend) S- U8 p1 }" k, @5 z: Z





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2