一:什麼是卷積數組
離散卷積的數學公式能夠表示爲以下形式:函數
f(x) = - 其中C(k)表明卷積操做數,g(i)表明樣本數據, f(x)表明輸出結果。spa
舉例以下:設計
假設g(i)是一個一維的函數,並且表明的樣本數爲G = [1,2,3,4,5,6,7,8,9]code
假設C(k)是一個一維的卷積操做數, 操做數爲C=[-1,0,1]blog
則輸出結果f(x)能夠表示爲 F=[1,2,2,2,2,2,2,2,1] //邊界數據未處理ip
以上只是一維的狀況下,當對一幅二維數字圖像加以卷積時,其數學意義能夠解釋以下:ci
源圖像是做爲輸入源數據,處理之後要的圖像是卷積輸出結果,卷積操做數做爲Filterget
在XY兩個方向上對源圖像的每一個像素點實施卷積操做。如圖所示:數學
粉紅色的方格每次在X/Y前進一個像素方格,就會產生一個新的輸出像素,圖中深藍色的代
表要輸出的像素方格,走徹底部的像素方格,就獲得了全部輸出像素。
圖中,粉紅色的矩陣表示卷積操做數矩陣,黑色表示源圖像– 每一個方格表明一個像素點。
二:卷積在數字圖像處理中應用
一副數字圖像能夠看做一個二維空間的離散函數能夠表示爲f(x, y), 假設有對於二維卷積操
做函數C(u, v) ,則會產生輸出圖像g(x, y) = f(x, y) *C(u,v), 利用卷積能夠實現對圖像模糊處理,邊緣檢測,產生軋花效果的圖像。
一個簡單的數字圖像卷積處理流程能夠以下:
1. 讀取源圖像像素
2. 應用卷積操做數矩陣產生目標圖像
3. 對目標圖像進行歸一化處理
4. 處理邊界像素
三使用模板處理圖像相關概念:
模板:矩陣方塊,其數學含義是一種卷積運算。
卷積運算:可看做是加權求和的過程,使用到的圖像區域中的每一個像素分別於卷積核(權矩陣)的每一個元素對應相
乘,全部乘積之和做爲區域中心像素的新值。
卷積核:卷積時使用到的權用一個矩陣表示,該矩陣與使用的圖像區域大小相同,其行、列都是奇數,
是一個權矩陣。
卷積示例:
3 * 3 的像素區域R與卷積核G的卷積運算:
R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9
四使用模板處理圖像的問題:
邊界問題:當處理圖像邊界像素時,卷積核與圖像使用區域不能匹配,卷積核的中心與邊界像素點對應,
卷積運算將出現問題。
處理辦法:
A. 忽略邊界像素,即處理後的圖像將丟掉這些像素。
B. 保留原邊界像素,即copy邊界像素處處理後的圖像。
五.經常使用模板:
六其餘
-----------------------------------------------------------------------------------------------------------
如下用$符號表示從負無窮大到正無窮大的積分。
一維卷積:
y(t)=g(k)*x(k)=$g(k)x(t-k)
先把函數x(k)相對於原點反折,而後向右移動距離t,而後兩個函數相乘再積分,就獲得了在t處的輸出。對每一個t值重複上述過程,就獲得了輸出曲線。
二維卷積:
h(x,y)=f(u,v)*g(u,v)=$$f(u,v)g(x-u,y-v)
先將g(u,v)繞其原點旋轉180度,而後平移其原點,u軸上像上平移x, v軸上像上平移y。而後兩個函數相乘積分,獲得一個點處的輸出。
在圖像中卷積是什麼意思呢,就是圖像就是圖像f(x),模板是g(x),而後將模版g(x)在模版中移動,每到一個位置,就把f(x)與g(x)的定義域相交的元素進行乘積而且求和,得出新的圖像一點,就是被卷積後的圖像.模版又稱爲卷積核.卷積核作一個矩陣的形狀。因爲大多數模板都是對稱的,因此模板不旋轉。
二維圖像卷積運算
import numpy as np from scipy import signal from scipy import misc import matplotlib.pyplot as plt face=misc.face(gray=True) #建立一個灰度圖像 scharr=np.array([[-3-3j,0-10j,+3-3j], [-10+0j,0+0j,+10+0j], [-3+3j,0+10j,+3+3j]]) #設置一個特殊的卷積和 grad=signal.convolve2d(face,scharr,boundary='symm',mode='same') #把圖像的face數組和設計好的卷積和做二維卷積運算,設計邊界處理方式爲symm fig,(ax1,ax2)=plt.subplots(1,2,figsize=(10,6)) #創建1行2列的圖fig ax1.imshow(face,cmap='gray') #顯示原始的圖 <matplotlib.image.AxesImage object at 0x00000000078FC198> ax1.set_axis_off() #不顯示座標軸 ax2.imshow(np.absolute(grad),cmap='gray') #顯示卷積後的圖 <matplotlib.image.AxesImage object at 0x00000000078FCE48> ax2.set_axis_off() #不顯示座標軸 fig.show() #顯示繪製好的畫布