|  | 
 
| 
本帖最后由 STGing 于 2022-9-26 20:25 编辑 / ?5 Y& U2 ^+ F' O5 ?4 v
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  
 # Q& g) X) `5 N1.双边波算法的实现  z3 j% c* W# e( H" r5 R* V
 滤波算法的基本思路,就是采用周边像素,加权平均计算一个新的像素,来缓减噪声对当前像素的影响。我们已经介绍了均值滤波,中值滤波,高斯滤波算法。但这几种算法都不够完美,还有继续提升的空间:
 ! t3 f2 j- }) o( Y1)均值滤波:简单粗暴的将窗口内的像素累加后求均值,将噪声平均化,同时边缘纹理也被抹平了,有模糊的作用,作为入门学习用。  U6 l  j' z& |5 M+ O6 c* k
 2)中值滤波:采用窗口内中值的方法,有效剔除了异常高亮或过暗的噪声,对椒盐噪声的去除效果比较好,但实际的图像会伴随着边缘纹理,由于只考虑中值,也会将图像细节去除,只是比均值滤波稍微好一点而已。
 1 E% j1 y9 Q. b+ X! V) Y( g& M3)高斯滤波:采用欧氏距离,权重呈正态分布,相比均值/中值更优,因为均值/中值权重未考虑距离因素,而高斯噪声则考虑了噪声相对当前像素,呈高斯分布的特性,效果更佳。但高斯滤波也只是考虑了距离,未考虑边缘纹理,对细节的保护仍然不佳。" O$ h' D+ V! t) Z# P
 那么,既考虑噪声高斯分布特性,由将图像边缘纹理考虑进去的滤波算法应运而生。这里我们提出更进一步的滤波—双边滤波。
 % `$ {" X2 K, ?6 ~我们这里在前面高斯滤波的基础上,追加实现双边滤波,计划采用3*3的窗口,高斯滤波权重直接采用上一节的代码生成,重点讲解如何进行权重的计算,及Matlab&FPGA的实现。% }4 H3 O/ T9 N& j1 i
 
 ' W0 p6 m9 }: C1.1.高斯滤波算法理论
 W/ U. k) P9 V双边滤波是一种非线性滤波器,它可以达到降噪平滑,同时又保持边缘的效果。和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均,来代表某个像素的强度,所用的加权平均也是基于高斯分布。
 9 |' u; }( e! M5 b3 i这里双边滤波的权重,不仅考虑了像素的欧式距离(如高斯滤波),还考虑了像素范围的辐射差异(比如像素与中心像素之间相似程度,也是高斯分布的),结合距离与相似度,最终计算得到最终的权重(距离与相似度的高斯分布)。& A0 B0 {, Y9 E7 _& V& A
 
   & o) ~3 k+ X" d引用双边滤波算法相关图解,如下所示,其中Gss为只考虑与当前像素空间距离的权重(space weight),而Gsr则为只考虑和当前像素相似度的权重(range weight),最后相乘,得到Gss*Gsr则为同时考虑了距离与相似度的权重,公式累加后最后归一化,得到最终的权重(space & rang)。
 2 R! Z& B# H# s" `( W& q* O由于双边滤波同时考虑了空间距离和像素相似度的影响,因此尤其在具有边缘梯度的图像中,能够有不错的效果。即在平坦区域,空间距离占优势,在边缘区域,像素间相似度占优势,可以直观的用下面这个图来表示(注明出处):) n5 q& E1 I+ n: V5 d% z' k
 
  % D2 v6 E) ?0 u3 ] ......! j8 M% q7 F/ v
 最后我们封装function便于调用,再给出完整的代码。如下所示:4 r  X6 u% V! a$ q5 F+ w2 [
 % 灰度图像双边滤波算法实现
 2 `; U/ g8 I& `, w) N5 i7 Z5 u" o/ S( Z% I为输入的灰度图像# D, _% P5 R/ F$ w' |2 O" v- @" X
 % n为滤波的窗口大小,为奇数
 ! l; y& D; R" I5 Y  Mfunction B=bilateral_filter_gray(I,n,sigma_d, sigma_r)   ( N" D$ c2 k* {; N- S4 G; I
 % ---------------------------------------------------
 ) q/ }  A8 v: Q# t; V  e% 仅供function自测使用5 b/ v2 [6 n) H5 D
 % clear all;   close all;  clc;& u& [0 E; n: _; P
 % I = rgb2gray(imread('../../images/Scart.jpg'));    % 读取jpg图像
 % f8 z9 P7 K& v6 G- w( g6 i" x# _% n = 3; sigma_d = 3; sigma_r = 0.1;
 . v, p+ C$ v' Y: ~dim = size(I);   %读取图像高度、宽度
 ) m. W( V9 O. b: q& @* Kw=floor(n/2);   %窗口 [-w, w]' [2 F/ D' T$ K6 ?, u8 `
 
 9 `, O; O- @3 T& H/ f% ---------------------------------------------------
 ( A  `) B' l2 w# s1 Q3 j8 |% 计算n*n高斯模板
 ' R( l, ~- g7 a$ x" C: D! pG1=zeros(n,n);   %n*n高斯模板. L7 \5 U0 S/ I) i
 for i=-w : w% p/ N# Z: ^8 u" M4 z
 for j=-w : w
 8 ~* A' {9 M3 t5 c! d        G1(i+w+1, j+w+1) = exp(-(i^2 + j^2)/(2*sigma_d^2)) ;, O9 \8 f! U" ~
 end9 t: {% }* o4 N  ?+ c
 end
 |3 @9 t$ z+ }* x$ `7 H) N) R' R' b9 B' m8 _4 I) s$ O) c: j
 % 归一化n*n高斯滤波模板; @/ z% s: U% W3 k  t
 temp = sum(G1(
  );0 Z+ R3 E' o7 q: W' k5 c2 o G2 = G1/temp;
 7 m. {7 `0 h  B1 J
 : B, L9 m8 Q) s2 M% n*n高斯模板 *1024定点化' |1 V" u) ~* I% c
 G3 = floor(G2*1024);
 Y+ i* q, Z# j! i" C; H' ~" r- j; P( T1 r
 I = double(I);
 2 n$ I) k7 ^8 w. e! u! y% ---------------------------------------------------+ g; ~% d$ Y8 J7 ?' e
 % 计算n*n双边滤波模板+ 滤波结果
 5 u8 Z: a1 `5 p0 [; D$ v4 ^6 A5 oh = waitbar(0,'Speed of bilateral filter process...');  %创建进度条
 8 ~! s( ?; S" T5 k9 ?. ?' VB = zeros(dim);; ^8 W# G' \: |+ V
 for i=1 : dim(1)7 U. b" a' L4 `& f8 h
 for j=1 : dim(2)
 ) Z' G- V3 O1 a% T  [9 Q) k         if(i<w+1 </w+1|| i>dim(1)-w || jdim(2)-w)
 4 P8 h* D. g6 d: _% q            B(i,j) = I(i,j);    %边缘像素取原值
 ' B+ N) d/ @" U% S$ P" J: s8 Q         else9 a" I: \" p7 A
 A = I(i-w:i+w, j-w:j+w);
 3 y- f2 M7 E4 w# L%              H =  exp( -(I(i,j)-A).^2/(2*sigma_r^2)  ) ;* j8 U5 e; i% W8 U
 H = exp( -((A-I(i,j))/255).^2/(2*sigma_r^2))  ;
 $ G% R, ~$ m) f, n. ~0 k             F = G3.*H;4 k: e4 N$ J. i5 @- Y, g" |
 F2=F/sum(F(
  ); 5 {( v& P' A; {% Q: C  `  K             B(i,j) = sum(F2(
  .*A(:));% ^: C& s) s+ ]: @( V6 L ......
 / ^# z+ u1 ?& R7 R# J
 | 
 |