數字影象處理:基本演算法-卷積和相關
阿新 • • 發佈:2019-02-18
在執行線性空間濾波時,經常會遇到兩個概念相關和卷積二者基本相似,在進行影象匹配是一個非常重要的方法。
(1)移動相關核的中心元素,使它位於輸入影象待處理畫素的正上方
(2)將輸入影象的畫素值作為權重,乘以相關核
(3)將上面各步得到的結果相加做為輸出
卷積的計算步驟:
(1)卷積核繞自己的核心元素順時針旋轉180度
(2)移動卷積核的中心元素,使它位於輸入影象待處理畫素的正上方
(3)在旋轉後的卷積核中,將輸入影象的畫素值作為權重相乘
超出邊界時要補充畫素,一般是新增0或者新增原始邊界畫素的值可以看出他們的主要區別在於計算卷積的時候,卷積核要先做旋轉。而計算相關過程中不需要旋轉相關核。
離散單位衝擊:我們將包含單個1而其餘全是0的函式成為離散單位衝擊。重要性質:一個函式與離散單位衝擊相關,在衝擊位置產生這個函式的一個翻轉版本。
f(x,y)
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
w(x,y)
1 2 3
4 5 6
0 0 0 0 0
0 9 8 7 0
0 6 5 4 0
0 3 2 1 0
0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
假如函式f中存在w的一個複製版本,即f:
0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
42 94 154 106 54
90 186 285 186 90
54 106 154 94 42
1^2+2^2+……+9^2 = 285
這就是用相關進行影象匹配的基本原理。當然了,在影象匹配時還要進行
相關函式的歸一化等操作。
相關是濾波器模板移過影象並計算計算每個位置乘積之和的處理卷積的機理相似,但濾波器首先要旋轉180度。
相關的計算步驟:(1)移動相關核的中心元素,使它位於輸入影象待處理畫素的正上方
(2)將輸入影象的畫素值作為權重,乘以相關核
(3)將上面各步得到的結果相加做為輸出
卷積的計算步驟:
(1)卷積核繞自己的核心元素順時針旋轉180度
(2)移動卷積核的中心元素,使它位於輸入影象待處理畫素的正上方
(3)在旋轉後的卷積核中,將輸入影象的畫素值作為權重相乘
(4)第三步各結果的和做為該輸入畫素對應的輸出畫素
離散單位衝擊:我們將包含單個1而其餘全是0的函式成為離散單位衝擊。重要性質:一個函式與離散單位衝擊相關,在衝擊位置產生這個函式的一個翻轉版本。
f 函式,w 濾波器模板。
eg:f(x,y)
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
w(x,y)
1 2 3
4 5 6
7 8 9
相關 f*w =0 0 0 0 0
0 9 8 7 0
0 6 5 4 0
0 3 2 1 0
0 0 0 0 0
卷積f*w=0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0
相關的用途:圖象的匹配假如函式f中存在w的一個複製版本,即f:
0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0
f*w是多少呢?讀者也自己算吧。
9 26 50 38 2142 94 154 106 54
90 186 285 186 90
54 106 154 94 42
21 38 50 26 9
是不是會發現w與f中w的複製版本重合時,該點的值最大。最大值為1^2+2^2+……+9^2 = 285
這就是用相關進行影象匹配的基本原理。當然了,在影象匹配時還要進行
相關函式的歸一化等操作。
matlab原始碼:
%函式f f = [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0]; %濾波器模板 w = [1 2 3 4 5 6 7 8 9]; %卷積 ff = conv2(f,w,'same') %這裡的引數same見下面說明 %相關 ff2 = imfilter(f,w) %影象匹配的基本原理 f2 = [ 0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0]; ff3 = imfilter(f2,w)
濾波器卷積與相關運算結果對比(按道理來說兩者的運算結果應該是一樣的啊?此處保留該問題。見下面另一份程式碼):
img=imread('guass0.01.bmp');
%邊緣檢測濾波器模板
w = [-1 0 -1
0 4 0
-1 0 -1];
%卷積
ff = conv2(img,w,'same');
subplot(121);imshow(ff);title('卷積運算結果');
%相關
ff2 = imfilter(img,w);
subplot(122);imshow(ff2);title('相關運算結果');
改寫了程式碼後:
img=imread('guass0.01.bmp');
img=double(img);
%邊緣檢測濾波器模板
w = [-1 0 -1
0 4 0
-1 0 -1];
%卷積
ff = conv2(img,w,'same');
subplot(121);imshow(ff);title('卷積運算結果');
%相關
ff2 = imfilter(img,w);
subplot(122);imshow(ff2);title('相關運算結果');
關於full, same以及valid三種引數的區別,如下面的例項所示:
full
same
valid
參考資源:
【1】http://www.cnblogs.com/libing64/archive/2011/12/13/2878738.html