|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 STGing 于 2022-9-26 20:25 编辑
3 W; [) c% s2 l( H5 q; O) h1 f: w6 u- ^% k2 e" U
1.双边波算法的实现
, Q& Y$ r6 |5 _& _! q. J滤波算法的基本思路,就是采用周边像素,加权平均计算一个新的像素,来缓减噪声对当前像素的影响。我们已经介绍了均值滤波,中值滤波,高斯滤波算法。但这几种算法都不够完美,还有继续提升的空间:
$ E. k9 J j$ ]8 k1)均值滤波:简单粗暴的将窗口内的像素累加后求均值,将噪声平均化,同时边缘纹理也被抹平了,有模糊的作用,作为入门学习用。
7 x) T8 g- e; a. u8 r5 F2)中值滤波:采用窗口内中值的方法,有效剔除了异常高亮或过暗的噪声,对椒盐噪声的去除效果比较好,但实际的图像会伴随着边缘纹理,由于只考虑中值,也会将图像细节去除,只是比均值滤波稍微好一点而已。( M* `2 `9 x8 b
3)高斯滤波:采用欧氏距离,权重呈正态分布,相比均值/中值更优,因为均值/中值权重未考虑距离因素,而高斯噪声则考虑了噪声相对当前像素,呈高斯分布的特性,效果更佳。但高斯滤波也只是考虑了距离,未考虑边缘纹理,对细节的保护仍然不佳。
5 e/ @+ t; U; A7 }6 N( B9 }那么,既考虑噪声高斯分布特性,由将图像边缘纹理考虑进去的滤波算法应运而生。这里我们提出更进一步的滤波—双边滤波。- k( x) g( ]- K) X6 V, _, a
我们这里在前面高斯滤波的基础上,追加实现双边滤波,计划采用3*3的窗口,高斯滤波权重直接采用上一节的代码生成,重点讲解如何进行权重的计算,及Matlab&FPGA的实现。
/ r( ]1 p( e0 Z! ]( W ]$ U! h- ^% k. w8 t, {
1.1.高斯滤波算法理论& i$ L3 x7 E2 t( T9 t. ^
双边滤波是一种非线性滤波器,它可以达到降噪平滑,同时又保持边缘的效果。和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均,来代表某个像素的强度,所用的加权平均也是基于高斯分布。2 K7 I4 Q1 h$ v) ]# s& Q1 D% V
这里双边滤波的权重,不仅考虑了像素的欧式距离(如高斯滤波),还考虑了像素范围的辐射差异(比如像素与中心像素之间相似程度,也是高斯分布的),结合距离与相似度,最终计算得到最终的权重(距离与相似度的高斯分布)。1 Z& z5 p4 W( x/ ]! S8 m
/ f% t ~ F2 m ]1 ~# ?
引用双边滤波算法相关图解,如下所示,其中Gss为只考虑与当前像素空间距离的权重(space weight),而Gsr则为只考虑和当前像素相似度的权重(range weight),最后相乘,得到Gss*Gsr则为同时考虑了距离与相似度的权重,公式累加后最后归一化,得到最终的权重(space & rang)。
5 I* P! |5 S) Z% B9 c由于双边滤波同时考虑了空间距离和像素相似度的影响,因此尤其在具有边缘梯度的图像中,能够有不错的效果。即在平坦区域,空间距离占优势,在边缘区域,像素间相似度占优势,可以直观的用下面这个图来表示(注明出处):) e% Q( ]& B; V( E* @+ e& Y j0 Z
* b! {: i- f' \- u& j
......
1 q0 s9 f! }+ h" B% M6 J- f- b最后我们封装function便于调用,再给出完整的代码。如下所示:( |0 `' P: k; w- h+ `" _
% 灰度图像双边滤波算法实现
& X( X6 D. S# E! { J% ~% I为输入的灰度图像9 H2 E& J P0 G0 J3 @
% n为滤波的窗口大小,为奇数
' V2 g/ L2 r9 l0 ?, D% \! {function B=bilateral_filter_gray(I,n,sigma_d, sigma_r)
6 c: Y- U5 X5 b$ }/ _% ---------------------------------------------------
; Q; x8 R- F9 m3 T- f; X% 仅供function自测使用( w& |' @( S- C$ q2 a7 f
% clear all; close all; clc;
) @- H- X; P3 w# r1 v% I = rgb2gray(imread('../../images/Scart.jpg')); % 读取jpg图像: t0 C" k# j- |, l( \: u
% n = 3; sigma_d = 3; sigma_r = 0.1; * @1 h2 u4 V5 d+ }+ C& w
dim = size(I); %读取图像高度、宽度
- b9 e4 S0 ?( P; Lw=floor(n/2); %窗口 [-w, w]/ K5 z1 l' g, e7 j1 a# i# j
- z! ^$ H" V2 y/ J( S0 i8 q
% ---------------------------------------------------
, z. E+ X- R j) Z; V w |% 计算n*n高斯模板5 `# u7 h7 x2 v" R* P& O
G1=zeros(n,n); %n*n高斯模板
3 j( ~6 _( A& ~) ~2 Efor i=-w : w
0 @8 [6 I0 \- p8 ]% P2 q for j=-w : w
; D4 P/ W9 v, L G1(i+w+1, j+w+1) = exp(-(i^2 + j^2)/(2*sigma_d^2)) ;+ U. x3 i7 a5 G6 V8 d# U, l" B
end4 \+ `% x7 w2 Z
end
- C7 B4 S5 B, u( ?! Z& o7 D$ d# x: e+ c: H- o8 a- h8 C
% 归一化n*n高斯滤波模板4 R! [" o1 b, q
temp = sum(G1( );
3 C- r# x. \8 D, {# u/ jG2 = G1/temp;3 D- B9 U s7 f5 i5 v- Y
% m- b/ N p( y! g9 S- v8 B* m* h
% n*n高斯模板 *1024定点化" o( [7 G! p6 v
G3 = floor(G2*1024);$ D3 X5 o7 V8 i- R
) M. C L4 E4 i l* U4 W3 \3 @) UI = double(I);- H! o8 }- F$ s2 m( |
% ---------------------------------------------------1 e2 ?: f6 i6 B) G9 ~* n
% 计算n*n双边滤波模板+ 滤波结果7 k0 h, K& n% z. }! t3 x+ r
h = waitbar(0,'Speed of bilateral filter process...'); %创建进度条
2 o$ l$ Q4 Q8 q! k; E: `B = zeros(dim);
/ Z' R7 b) |& e' R& n5 bfor i=1 : dim(1)
% O4 s ^% x t8 s' L! y- T0 j for j=1 : dim(2). y9 ]" M" ?2 w. W; B7 w$ Z: h
if(i<w+1 </w+1|| i>dim(1)-w || jdim(2)-w)
- P- _& w$ u0 f, F5 J2 m6 x' _ B(i,j) = I(i,j); %边缘像素取原值" r! S- `( Z% }" R- z& ?
else% _! q$ V1 {3 M! T. q# { D
A = I(i-w:i+w, j-w:j+w);
6 @* v8 G3 v* W4 @+ G% H = exp( -(I(i,j)-A).^2/(2*sigma_r^2) ) ;
1 X2 t6 T) X6 {' ], Y H = exp( -((A-I(i,j))/255).^2/(2*sigma_r^2)) ;
, k% L7 z9 u! ?1 P F = G3.*H;8 [3 v/ f7 |0 d5 g' d3 S
F2=F/sum(F( );
" ?; l' ]- x- x% l, k B(i,j) = sum(F2( .*A(:));
/ K/ X# a% r8 I. L, f+ X......
3 O" c. @. h2 m, _ R |
|