1. 程式人生 > >matlab高斯2D模糊的函式

matlab高斯2D模糊的函式

function [ f_blurring ] = Func_GaussianBlurring2D( I,FWHM, Method,Pixel_Size,Pad)


%   Pixel_Size = 1e-6;     %   Pixel Size [m]
%   FWHM = 5;              %   [pixels]
%   Method = 1;


sigma = FWHM/2.0/sqrt(2.0*log(2.0));    % in pixel
SIGMA = FWHM*Pixel_Size/2.0/sqrt(2.0*log(2.0));  % in physical dimension


%% Sptial Convolution
% Method 1 is less optimized than method 2, beacuse the discretized Gassian
% kernal in spatial domain may not be accurate enough


if Method == 1  


    H = fspecial('gaussian',2^nextpow2(sigma*64),sigma);
    f_blurring = imfilter(I, H, 'replicate');
    
    return 
        
end
    
%% Frequency Domain    




[rows,cols]=size(I);       % rows and cols must be even
f_pad = padarray(I, [rows/2, cols/2], Pad);     % Pad the input wavefield matrix


delta_x = Pixel_Size;


%% The FT of the Gaussian kernel is known


if Method == 2
 
F_max = 0.5*(1/delta_x);
    delta_k = (2*F_max)/(rows*2);
    [Kx, Ky] = meshgrid((-rows:1:rows-1)*delta_k,(-cols:1:cols-1)*delta_k);
    F_gauss_kernel = exp( - (2*pi^2)*SIGMA^2*(Kx.^2+Ky.^2)) ; 
            %   The FT expression of the standard normalized Gassian distribution
    F_gauss_kernel = fftshift(F_gauss_kernel);
            %   In order to match the arrangement of F_pad
    F_pad = fft2(f_pad);
    
    f_pad_blurring = ifft2(F_pad.*F_gauss_kernel);


    f_blurring = abs(f_pad_blurring(rows/2+1:end-rows/2,cols/2+1:end-cols/2));   
    
    
    return
end


%% A more precise description of matlab FFT operations
if Method == 2.1


F_max = 0.5*(1/delta_x);
    delta_k = (2*F_max)/(rows*2);
    [Kx, Ky] = meshgrid((-rows:1:rows-1)*delta_k,(-cols:1:cols-1)*delta_k);    
    F_gauss_kernel = exp( - (2*pi^2)*SIGMA^2*(Kx.^2+Ky.^2)); 
            %   The FT expression of the standard normalized Gassian distribution
            %   arraging from -Fs_max to Fs_max
        
    F_pad = ifftshift(fft2(f_pad)*delta_x^2);
            %   The true fourier transform from a spatial domain function 
            %   fftshift is to rearrange it from -Fs_max to Fs_max
    
    f_pad_blurring = ifft2(ifftshift(F_pad.*F_gauss_kernel))*(rows*2*cols*2)*(delta_k)^2;
            %   The true inverse Fourier transform from a frequency domain function
            %   ifftshift is to rearrange it from 0 to 2*Fs_max
            %   The result starts from index 0 in the spatial domain
            
    f_blurring = abs(f_pad_blurring(rows/2+1:end-rows/2,cols/2+1:end-cols/2));   


end
%% The spatial domain expression of the Gaussian kernel is known 
% Method 3 is less optimized than method 2, beacuse in some cases where
% the sigma is too small, the spatial sampling is not enough to evaluate
% the Gaussian kernel


if Method == 3


    [x, y] = meshgrid((-rows:1:rows-1)*delta_x,(-cols:1:cols-1)*delta_x);
    gauss_kernel = 1/(2*pi*SIGMA^2) * exp(-(x.^2+y.^2)/(2*SIGMA^2));
            %   the standard normalized Gassian distribution    
    gauss_kernel = fftshift(gauss_kernel);
            %   rearrange the gassian kernel profile to start with the peak
            %   otherwise the kernel will introduce pixels delay
    F_gauss_kernel = fft2(gauss_kernel) * delta_x^2;    
            %  FFT needs multiplying delta_x^2 to perform ture FT magnitude
    
    F_pad = fft2(f_pad);
    
    f_pad_blurring = ifft2(F_pad.*F_gauss_kernel);    


    f_blurring = abs(f_pad_blurring(rows/2+1:end-rows/2,cols/2+1:end-cols/2));   
    
    return;
    
end
  


%% A more precise description of matlab FFT operations


if Method == 3.1
    
F_max = 0.5*(1/delta_x);
    delta_k = (2*F_max)/(rows*2);    
    [x, y] = meshgrid((-rows:1:rows-1)*delta_x,(-cols:1:cols-1)*delta_x);
    gauss_kernel = 1/(2*pi*SIGMA^2) * exp(-(x.^2+y.^2)/(2*SIGMA^2));
            %   the standard normalized Gassian distribution    
    gauss_kernel = fftshift(gauss_kernel);
            %   rearrange the gassian kernel profile to start with the peak
            %   otherwise the kernel will introduce pixels delay
    F_gauss_kernel = fft2(gauss_kernel) * delta_x^2;    
            %  FFT needs multiplying delta_x^2 to perform ture FT magnitude
            %  Here it starts with the frequency k=0
    F_gauss_kernel = fftshift(F_gauss_kernel);  
            %  Rearrange the result to start with -Fs_max
    
    F_pad = fft2(f_pad) * delta_x^2;
    F_pad = fftshift(F_pad);
    
    F_pad_blurring = F_pad.*F_gauss_kernel;
    
    f_pad_blurring = ifft2(ifftshift(F_pad_blurring))*(rows*2*cols*2)*(delta_k)^2;


    f_blurring = abs(f_pad_blurring(rows/2+1:end-rows/2,cols/2+1:end-cols/2));   
    
    return;
    
end


end



相關推薦

matlab2D模糊函式

function [ f_blurring ] = Func_GaussianBlurring2D( I,FWHM, Method,Pixel_Size,Pad) %   Pixel_Size = 1e-6;     %   Pixel Size [m] %   FWHM

matlab 模糊非庫函式實現方式

簡單講一下原理和思路:   高斯模糊就是讓一個高斯矩陣和所要模糊的矩陣相點乘(即兩個矩陣對應位置的兩個數相乘),然後把所得矩陣的各項之和相加,即為模糊中心點的值。   所謂高斯矩陣就是由高斯函式(即

matlab:畫二維分佈密度函式

首先,把二維正態分佈密度函式的公式貼這裡 這隻圖好大啊~~ 但是上面的那個是多維正態分佈的密度函式的通式,那個n階是對稱正定方陣叫做協方差矩陣,其中的x,pi,u都是向量形式。雖然這個式子很酷,但是用在matlab裡畫圖不太方面,下面換一個 這個公式與上面的

濾波-模糊圖片

#include <iostream> #include <opencv2/opencv.hpp> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using name

影象模糊演算法及其 C 實現

高斯模糊的基本思路是根據二維 正太分佈 正態分佈 (感謝 xhr 大牛指正錯別字) 公式生成一個高斯矩陣, 求新影象中的每一點時, 將高斯矩陣的中心對準舊影象的這一點, 並將所有點根據高斯矩陣上對應的點加權平均. 二維正態分佈公式如下: u, v 分別為水平、豎直距離. 觀察可得, 當 r>3σ

安卓 背景模糊popupwindow,彈簧彈出 rebounds

最終類似效果圖,沒有截動畫,gridelayout彈上來的時候是波紋的。 直接上程式碼。 public class MyBlurPopWin extends BlurPopupWindow { Context mContext; GridLayout

openCV 中的濾波GaussianBlur函式

在上次的opencv原始碼解析之濾波前言1中,按照opencv_tutorials.pdf中的濾波部分試了下常用的4種濾波器的使用方法。在opencv的C++中,這4個函式分別為:blur,GaussianBlur,meidaBlur,bilateralFilter.下面

用opencv模仿matlab中的fspecial()函式建立一個自定義空間濾波器模板

模仿matlab裡的fspecial()函式,建立一個自定義空間高斯濾波器模板。 基本原理:二維高斯核函式的基本形式是這樣滴: 通常我們的座標都是x和y整數,要產生一個3x3的濾波器,我們要以中心為基礎取樣,這樣第一個值為(-1,-1),以後依次排序到(1,1)。這樣就可以產生一個mxn

Matlab繪製三維曲面(以二維函式為例)

  寒假學習了一下Python下的NumPy和pymatlab,感覺不是很容易上手。來學校之後,決定繼續看完數字影象處理一書。還是想按照上學期的模式,邊看邊實現書中的演算法。上學期看的時候,是用C語言實現的,發現寫程式太耗時間了,所以決定還是學習下Matlab吧(寒假莫有學會Python中的那些庫應用。。。)

Matlab中產生正態分佈隨機數的函式normrnd-----用來產生隨機矩陣

   >> help normrnd NORMRND Random arrays from the normal distribution. R = NORMRND(MU,SIGMA) returns an array of random numbers chosen from a normal

模糊函式 c 程式碼

注:程式碼來源於 http://hi.baidu.com/iceboy_/blog/item/729b79cae4744a18be09e6e9.html ,本人只是稍走修改,測試過,能使用。模糊後的資料保存於 傳入的data中。  int gaussBlur:(int *d

模糊 matlab

close all;image = imread('66_input.png');figure(1),imshow(image);w=fspecial('gaussian',[5 5],5);im=imfilter(image,w);figure(2),imshow(im);

C#呼叫GDI+1.1中的函式實現模糊、USM銳化等經典效果。

/// <summary> /// 對影象進行高斯模糊,參考:http://msdn.microsoft.com/en-us/library/ms534057(v=vs.85).aspx /// </summary> /// <

matlab練習程式(生成多維分佈概率密度函式

clear all; close all; clc; randn('seed',0); %%一維高斯函式 mu=0; sigma=1; x=-6:0.1:6; y=normpdf(x,mu,sigma); plot(x,y); figure; %%二維或多維高斯函式 m

Unity shader學習之屏幕後期處理效果之模糊

歸一化 length spl 學習 baidu 一個 one ogr stat 高斯模糊,見 百度百科。 也使用卷積來實現,每個卷積元素的公式為: 其中б是標準方差,一般取值為1。 x和y分別對應當前位置到卷積中心的整數距離。 由於需要對高斯核中的權重進行歸一化,即使所有權

python 寫matlab中的加性白噪聲AWGN

power 原始信號 code 高斯 mat class wid .cn ges 定義 原始信號:x 噪聲信號:n 信噪比:SNR 信號長度:N def wgn(x, snr): snr = 10**(snr/10.0) xpower = np

Unity3D Shader 模糊

logs ++ sampler += form return turn gauss pub //Shader Shader "Hidden/GaussianBlur" { Properties { _MainTex ("Texture"

基於opencv3.0下的人臉識別和識別部分的模糊處理

根據 proc enter BE AS lur .com code 示例 如題 這裏將任務分解為三大部分: 1.錄播放視頻 2.人臉識別 3.部分高斯模糊 其中重點放在人臉識別和部分高斯模糊上 1.錄播放視頻(以opencv中的VideoCapture類進行實現) 首先羅

模糊原理,算法

gin www. ssi div .cn wrap 直接 不變 有一個 高斯模糊原理,算法 參考文章:圖像卷積與濾波的一些知識點   要學習高斯模糊我們首先要知道一些基本概念: 線性濾波與卷積的基本概念 線性濾波可以說是圖像處理最基本的方法,它可以允許我們

opencv3 圖片模糊操作-均值濾波 濾波 中值濾波 雙邊濾波

empty size mage point ima could not key image ace #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using