一:什么是卷積
離散卷積的數學公式可以表示為如下形式:
f(x) = - 其中C(k)代表卷積操作數,g(i)代表樣本數據, f(x)代表輸出結果。
舉例如下:
假設g(i)是一個一維的函數,而且代表的樣本數為G = [1,2,3,4,5,6,7,8,9]
假設C(k)是一個一維的卷積操作數, 操作數為C=[-1,0,1]
則輸出結果f(x)可以表示為 F=[1,2,2,2,2,2,2,2,1] //邊界數據未處理
以上只是一維的情況下,當對一幅二維數字圖像加以卷積時,其數學意義可以解釋如下:
源圖像是作為輸入源數據,處理以后要的圖像是卷積輸出結果,卷積操作數作為Filter
在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() #顯示繪制好的畫布
