详析数字图像中高斯模糊理论及实现
高斯模糊(英語:Gaussian Blur),也叫高斯平滑。是在Adobe Photoshop、GIMP以及Paint.NET等圖像處理軟件中廣泛使用的處理效果,通經常使用它來降低圖像噪聲以及降低細節層次。
簡單介紹:高斯模糊(Gaussian Blur)是美國Adobe圖像軟件公司開發的一個圖像處理軟件:Adobe Photoshop(系列)中的一個濾鏡,詳細的位置在:濾鏡—模糊——高斯模糊!
高斯模糊的原理中,它是依據高斯曲線調節像素色值,它是有選擇地模糊圖像。說得直白一點,就是高斯模糊能夠把某一點周圍的像素色值按高斯曲線統計起來,採用數學上加權平均的計算方法得到這條曲線的色值,最后能夠留下人物的輪廓,即曲線.是指當 Adobe Photoshop 將加權平均應用于像素時生成的鐘形曲線。
原理:
1 周邊像素的平均值
所謂”模糊”。能夠理解成每一個像素都取周邊像素的平均值。
上圖中,2是中間點。周邊點都是1。
”中間點”取”周圍點”的平均值。就會變成1。在數值上,這是一種”平滑化”。在圖形上。就相當于產生”模糊”效果,”中間點”失去細節。
顯然,計算平均值時,取值范圍越大,”模糊效果”越強烈。
上圖各自是原圖、模糊半徑3像素、模糊半徑10像素的效果。模糊半徑越大,圖像就越模糊。從數值角度看,就是數值越平滑。
接下來的問題就是,既然每一個點都要取周邊像素的平均值。那么應該怎樣分配權重呢?
假設使用簡單平均。顯然不是非常合理,由于圖像都是連續的,越靠近的點關系越密切,越遠離的點關系越疏遠。
因此,加權平均更合理,距離越近的點權重越大。距離越遠的點權重越小。
2 正態分布權重
正態分布顯然是一種可取的權重分配模式。
在圖形上。正態分布是一種鐘形曲線,越接近中心,取值越大,越遠離中心,取值越小。計算平均值的時候,我們僅僅須要將”中心點”作為原點,其它點依照其在正態曲線上的位置,分配權重。就能夠得到一個加權平均值。
3 高斯函數
上面的正態分布是一維的,圖像都是二維的。所以我們須要二維的正態分布。
正態分布的密度函數叫做”高斯函數”(Gaussian function)。它的一維形式是:
當中,μ是x的均值,σ是x的方差。由于計算平均值的時候。中心點就是原公式進一步推導,由于計算平均值的時候,中心點就是原點,所以μ等于0。
依據一維高斯函數。能夠推導得到二維高斯函數:
有了這個函數 ,就能夠計算每一個點的權重了。
4 權重矩陣
假定中心點的坐標是(0,0),那么距離它近期的8個點的坐標例如以下,則權重前的矩陣為:
為了計算權重矩陣,須要設定σ的值。假定σ=1.5,則模糊半徑為1的權重矩陣例如以下:
這9個點的權重總和等于0.4787147。假設僅僅計算這9個點的加權平均。還必須讓它們的權重之和等于1,因此上面9個值還要分別除以0.4787147,得到終于的權重矩陣。
5 計算高斯模糊
有了權重矩陣,就能夠計算高斯模糊的值了。
假設現有9個像素點。灰度值(0-255)例如以下:
每一個點乘以自己的權重值:
將這9個值加起來,就是中心點的高斯模糊的值。
對全部點反復這個過程,就得到了高斯模糊后的圖像。假設原圖是彩色圖片,能夠對RGB三個通道分別做高斯模糊。
6 實現代碼
此代碼為簡單的高斯模糊生成代碼,核心思想為取中心點像素值,依照步長為1 進行模糊。
(java代碼)
package filter; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO;public class GaussianBlur { /* 簡單的高斯模糊算法@param args@return void@see[類成員,類方法]*/public static void main(String[] args) throws IOException {//圖片讀取路徑String pathname="d:\\my\\1.jpg";BufferedImage img = ImageIO.read(new File(pathname));System.out.println(img);int height =img.getHeight();int width = img.getWidth();int[][]matrix = new int [3][3];int []values = new int [9];for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {readPixel(img,i,j,values);//讀取圖像的像素值fillMatrix(matrix,values);//將圖像的像素值填充到矩陣中img.setRGB(i, j, avgMatrix(matrix));//又一次依照平均值來生成新的img,將依照RGB模型整數像素數組設置為圖像數據}}//圖片保存路徑String pathname1="d:\\my\\2.jpg";ImageIO.write(img, "jpeg", new File(pathname1));}//此函數的功能是將BuffedImage矩陣的像素值取出來public static void readPixel(BufferedImage img, int x, int y, int[] pixels) {int xStart = x-1;int yStart = y-1;int current = 0;for (int i = xStart; i <3+xStart ; i++) {for (int j = yStart; j <3+yStart;j++) {int tx=i;if (tx<0){tx =-tx;}else if (tx>=img.getWidth()){tx=x;}int ty=j;if (ty<0){ty =-ty;}else if (ty>=img.getHeight()){ty=y;}pixels[current++]= img.getRGB(tx, ty);}}}//此函數功能為給定像素值。將像素值填充入矩陣中去public static void fillMatrix(int[][] matrix, int ... values) {int filled = 0;for (int i = 0; i < matrix.length; i++) {int []x =matrix[i] ;for (int j = 0; j < x.length; j++) {x[j]=values[filled++];}}} //此函數的功能是將像素的矩陣進行高斯模糊,又一次生成一個模糊后的矩陣public static int avgMatrix(int[][] matrix) {int r=0;int g=0;int b=0;for (int i = 0; i < matrix.length; i++) {int[] x =matrix[i];for (int j = 0; j < x.length; j++) {if (j==1) {continue;}Color c = new Color(x[i]);r+= c.getRed();g+= c.getGreen();b+= c.getGreen();}}return new Color(r/8,g/8,b/8).getRGB(); } }效果例如以下:高斯模糊前后對照圖
我們再用MATLAB 進行實現一下(用MATLAB 處理圖像既專業又方便,哈哈)
模糊又能夠稱為退化。我們能夠用直接從庫中調取。
無論是高斯模糊還是運動模糊非常easy實現地。。。
function ifbl = degrade(im, LEN, THETA, noisetype, M, V) %Converting the image to grayshade by eliminating hue and %saturation將圖像轉化為灰色來消除色相飽和度 if size(im, 3) == 3,im = rgb2gray(im); end%Converting to double imd = im2double(im);%Converting the image to frequency domain將圖像轉化到頻率域中 imf = fft2(imd);%Create PSF of degradation,濾波器卷積。逆時針角度THETA PSF = fspecial('gussian',LEN,THETA);%Convert psf to otf of desired size %OTF is Optical Transfer Function %fbl is blurred image in frequency domain,psf2otf是將點擴散函數轉換成光學轉換函數 OTF = psf2otf(PSF,size(im));%Blurring the image fbl = OTF.*imf;%Converting back to spatial domainf返回空間域 ifbl = abs(ifft2(fbl));%Checking if the image is in the range 0 to 1檢查圖像的范圍 for i = 1:size(ifbl, 1)for j = 1:size(ifbl, 2)if ifbl(i, j) >= 1ifbl(i, j) = 0.999999;endif ifbl(i, j) <= 0ifbl(i, j) = 0.000001;endend end %Adding noise if nargin>3if nargin==4 %using default valuesifbl = imnoise(ifbl, noisetype);elseif nargin==5 %specifying additional parameters explicitlyifbl = imnoise(ifbl, noisetype, M);elseif nargin==6 %specifying additional parameters explicitlyifbl = imnoise(ifbl, noisetype, M, V);end end高斯模糊。默認的高斯噪聲均值m為0,方差var為0.01(參數能夠自己設置)
好了,基本能夠了,就是這個feel。。。
總結
以上是生活随笔為你收集整理的详析数字图像中高斯模糊理论及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: selenium + python自动化
- 下一篇: SQLServer Always On