圖片高斯模糊[python]
阿新 • • 發佈:2019-01-07
簡介
畢業設計圖片處理部分需要模擬日常生活中的一些圖片模糊情況,於是在百度百科”高斯模糊”後自己簡單實現了下,高斯模糊原理很簡單,就是用高斯分佈對影象畫素值進行卷積。本篇部落格建議看完百度百科後再看。
高斯函式(正太分佈)
一維高斯分佈
- 公式
σ 為標準差,u為均值,標準差越大,影象越扁,標準差越小,影象越陡。
- 分佈圖像
二維高斯分佈
- 公式
- 分佈圖像
高斯分佈賊TM優美,具有高度的對稱性。
高斯模糊演算法(以二維高斯分佈舉例,radius=1, σ = 0.84089642)
- 計算權重矩陣W,直觀來看如下圖所示,W為3x3矩陣,將9個值相加得到和sum,W := W/sum即可得到權重矩陣W
- 進行卷積,x、y方向步長為1。即用(2radius)×(2radius)×3(RGB通道數)的過濾器對影象進行卷積,卷積後的和為新的畫素值。
程式碼
from PIL import Image, ImageFilter
import numpy as np
import math
import matplotlib.pyplot as plt
import time
# 對影象進行搞死模糊處理, RGB 3通道影象,未優化
# 輸入image_array.shape = (width, height, channels), radius=半徑
def gaussian_blur(image_array, radius) :
#1.權重矩陣
weight_matrix = np.zeros((2*radius+1, 2*radius+1))
for i in range(2*radius+1):
for j in range(2*radius+1):
weight_matrix[i, j] = GussianFunction2D(i-radius, j-radius)
weight_matrix /= weight_matrix.sum()
#2.根據權重矩陣weight_matrix更新新的影象畫素值
image_array_gau = np.zeros(image_array.shape)
for i in range(image_array.shape[0]-2*radius):
for j in range(image_array.shape[1]-2*radius):
for k in range(3):
# 時間完全耗在這一步運算上了
a = np.multiply(weight_matrix, image_array[i:(i+2*radius+1), j:(j+2*radius+1), k])
image_array_gau[i+radius, j+radius, k] = a.sum()
return image_array_gau/255
# 計算二維高斯函式的值G(x, y)
def GussianFunction2D(x, y):
sigma = 2.5 #sigma為標準差,sigma越大, 高斯函式影象越扁, 則模糊效果越明顯; sigma越小, 趨向0的話, 則模糊效果越差越接近真實影象
return (1/(2*math.pi*sigma**2)) * math.e**(-(x**2 + y**2)/(2*sigma**2))
rs_dir = '/home/wanglei/wl/face-enhance/resource'
image = Image.open(rs_dir + '/yangmi1.jpg')
# image = image.filter(ImageFilter.GaussianBlur(radius=3))
# image.show()
image_array = np.array(image)
time1 = time.time()
image_array_gau = gaussian_blur(image_array, 5)
time2 = time.time()
print('二維卷積耗時:' + str(time2-time1))
plt.figure('GaussianBlur')
plt.imshow(image_array_gau)
plt.show()
實驗結果
原圖:
模糊後圖:
結束語
高斯模糊原理及其簡單,不詳細說明,推薦一篇及其詳細的部落格連結和百度百科連結,不管怎麼說,上手寫下程式碼很容易理解,具體的優化不戲說。
Python下實現圖片的高斯模糊化
高斯模糊-百度百科