高斯模糊(英語:Gaussian Blur),也叫高斯平滑。是在Adobe Photoshop、GIMP以及Paint.NET等圖像處理軟件中普遍使用的處理效果,通常常使用它來下降圖像噪聲以及下降細節層次。
簡單介紹:高斯模糊(Gaussian Blur)是美國Adobe圖像軟件公司開發的一個圖像處理軟件:Adobe Photoshop(系列)中的一個濾鏡,詳細的位置在:濾鏡—模糊——高斯模糊!java
高斯模糊的原理中,它是依據高斯曲線調節像素色值,它是有選擇地模糊圖像。說得直白一點,就是高斯模糊可以把某一點周圍的像素色值按高斯曲線統計起來,採用數學上加權平均的計算方法獲得這條曲線的色值,最後可以留下人物的輪廓,即曲線.是指當 Adobe Photoshop 將加權平均應用於像素時生成的鐘形曲線。算法
原理:
1 周邊像素的平均值
所謂」模糊」。可以理解成每個像素都取周邊像素的平均值。
上圖中,2是中間點。周邊點都是1。數組
」中間點」取」周圍點」的平均值。就會變成1。在數值上,這是一種」平滑化」。在圖形上。就至關於產生」模糊」效果,」中間點」失去細節。markdown
顯然,計算平均值時,取值範圍越大,」模糊效果」越強烈。
上圖各自是原圖、模糊半徑3像素、模糊半徑10像素的效果。模糊半徑越大,圖像就越模糊。從數值角度看,就是數值越平滑。
接下來的問題就是,既然每個點都要取周邊像素的平均值。那麼應該怎樣分配權重呢?
假設使用簡單平均。顯然不是很是合理,因爲圖像都是連續的,越靠近的點關係越密切,越遠離的點關係越疏遠。dom
所以,加權平均更合理,距離越近的點權重越大。距離越遠的點權重越小。
2 正態分佈權重
正態分佈顯然是一種可取的權重分配模式。
在圖形上。正態分佈是一種鐘形曲線,越接近中心,取值越大,越遠離中心,取值越小。計算平均值的時候,咱們僅僅需要將」中心點」做爲原點,其它點依照其在正態曲線上的位置,分配權重。就可以獲得一個加權平均值。
3 高斯函數
上面的正態分佈是一維的,圖像都是二維的。因此咱們需要二維的正態分佈。函數
正態分佈的密度函數叫作」高斯函數」(Gaussian function)。它的一維形式是:
post
當中,μ是x的均值,σ是x的方差。因爲計算平均值的時候。中心點就是原公式進一步推導,因爲計算平均值的時候,中心點就是原點,因此μ等於0。ui
依據一維高斯函數。可以推導獲得二維高斯函數:
有了這個函數 ,就可以計算每個點的權重了。spa
4 權重矩陣
假定中心點的座標是(0,0),那麼距離它近期的8個點的座標例如如下,則權重前的矩陣爲:
code
爲了計算權重矩陣,需要設定σ的值。假定σ=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) >= 1
ifbl(i, j) = 0.999999;
end
if ifbl(i, j) <= 0
ifbl(i, j) = 0.000001;
end
end
end
%Adding noise
if nargin>3
if nargin==4 %using default values
ifbl = imnoise(ifbl, noisetype);
elseif nargin==5 %specifying additional parameters explicitly
ifbl = imnoise(ifbl, noisetype, M);
elseif nargin==6 %specifying additional parameters explicitly
ifbl = imnoise(ifbl, noisetype, M, V);
end
end
高斯模糊。默認的高斯噪聲均值m爲0,方差var爲0.01(參數可以本身設置)
好了,基本可以了,就是這個feel。。。