圖像處理(卷積)做者太棒了html
這裏討論利用輸入圖像中像素的小鄰域來產生輸出圖像的方法,在信號處理中這種方法稱爲濾波(filtering)。其中,最經常使用的是線性濾波:輸出像素是輸入鄰域像素的加權和。node
步驟:app
1)滑動核,使其中心位於輸入圖像g的(i,j)像素上函數
2)利用上式求和,獲得輸出圖像的(i,j)像素值性能
3)充分上面操縱,直到求出輸出圖像的全部像素值ui
例:url
A = [17 24 1 8 15 h = [8 1 6
23 5 7 14 16 3 5 7
4 6 13 20 22 4 9 2]
10 12 19 21 3
11 18 25 2 9]spaMatlab 函數:imfilter(A,h)
步驟:
1)將核圍繞中心旋轉180度
2)滑動核,使其中心位於輸入圖像g的(i,j)像素上
3)利用上式求和,獲得輸出圖像的(i,j)像素值
4)充分上面操縱,直到求出輸出圖像的全部像素值
Matlab 函數:Matlab 函數:imfilter(A,h,'conv')% imfilter默認是相關算子,所以當進行卷積計算時須要傳入參數'conv'
當對圖像邊緣的進行濾波時,核的一部分會位於圖像邊緣外面。
經常使用的策略包括:
1)使用常數填充:imfilter默認用0填充,這會形成處理後的圖像邊緣是黑色的。
2)複製邊緣像素:I3 = imfilter(I,h,'replicate');
fspecial函數能夠生成幾種定義好的濾波器的相關算子的核。
例:unsharp masking 濾波
12345I = imread(
'moon.tif'
);
h = fspecial(
'unsharp'
);
I2 = imfilter(I,h);
imshow(I), title(
'Original Image'
)
figure, imshow(I2), title(
'Filtered Image'
)
更復雜些的濾波算子通常是先利用高斯濾波來平滑,而後計算其1階和2階微分。因爲它們濾除高頻和低頻,所以稱爲帶通濾波器(band-pass filters)。
在介紹具體的帶通濾波器前,先介紹必備的圖像微分知識。
對於離散狀況(圖像),其導數必須用差分方差來近似,有
,前向差分 forward differencing (1.2)
,中心差分 central differencing (1.3)
1)前向差分的Matlab實現
123456789101112131415161718192021222324252627function dimg = mipforwarddiff(img,direction)
% MIPFORWARDDIFF Finite difference calculations
%
% DIMG = MIPFORWARDDIFF(IMG,DIRECTION)
%
% Calculates the forward-difference
for
a given direction
% IMG : input image
% DIRECTION :
'dx'
or
'dy'
% DIMG : resultant image
%
% See also MIPCENTRALDIFF MIPBACKWARDDIFF MIPSECONDDERIV
% MIPSECONDPARTIALDERIV
% Omer Demirkaya, Musa Asyali, Prasana Shaoo, ... 9/1/06
% Medical Image Processing Toolbox
imgPad = padarray(img,[1 1],
'symmetric'
,
'both'
);%將原圖像的邊界擴展
[row,col] = size(imgPad);
dimg = zeros(row,col);
switch
(direction)
case
'dx'
,
dimg(:,1:col-1) = imgPad(:,2:col)-imgPad(:,1:col-1);%x方向差分計算,
case
'dy'
,
dimg(1:row-1,:) = imgPad(2:row,:)-imgPad(1:row-1,:);
otherwise, disp(
'Direction is unknown'
);
end;
dimg = dimg(2:end-1,2:end-1);
2)中心差分的Matlab實現
12345678910111213141516171819202122232425262728function dimg = mipcentraldiff(img,direction)
% MIPCENTRALDIFF Finite difference calculations
%
% DIMG = MIPCENTRALDIFF(IMG,DIRECTION)
%
% Calculates the central-difference
for
a given direction
% IMG : input image
% DIRECTION :
'dx'
or
'dy'
% DIMG : resultant image
%
% See also MIPFORWARDDIFF MIPBACKWARDDIFF MIPSECONDDERIV
% MIPSECONDPARTIALDERIV
% Omer Demirkaya, Musa Asyali, Prasana Shaoo, ... 9/1/06
% Medical Image Processing Toolbox
img = padarray(img,[1 1],
'symmetric'
,
'both'
);
[row,col] = size(img);
dimg = zeros(row,col);
switch
(direction)
case
'dx'
,
dimg(:,2:col-1) = (img(:,3:col)-img(:,1:col-2))/2;
case
'dy'
,
dimg(2:row-1,:) = (img(3:row,:)-img(1:row-2,:))/2;
otherwise,
disp(
'Direction is unknown'
);
end
dimg = dimg(2:end-1,2:end-1);
1
實例:技術圖像x方向導數
12I = imread(
'coins.png'
); figure; imshow(I);
Id = mipforwarddiff(I,
'dx'
); figure, imshow(Id);
原圖像 x方向1階導數
圖像I的梯度定義爲 ,其幅值爲
。出於計算性能考慮,幅值也可用
來近似。
Matlab函數
1)gradient:梯度計算
2)quiver:以箭頭形狀繪製梯度。注意放大下面最右側圖可看到箭頭,因爲這裏計算橫豎兩個方向的梯度,所以箭頭方向都是水平或垂直的。
實例:仍採用上面的原始圖像
12345I =
double
(imread(
'coins.png'
));
[dx,dy]=gradient(I);
magnitudeI=sqrt(dx.^2+dy.^2);
figure;imagesc(magnitudeI);colormap(gray);%梯度幅值
hold on;quiver(dx,dy);%疊加梯度方向
梯度幅值 梯度幅值+梯度方向
拉普拉斯算子是n維歐式空間的一個二階微分算子。它定義爲兩個梯度向量算子的內積
其在二維空間上的公式爲: (3.3)
對於1維離散狀況,其二階導數變爲二階差分
2)所以,二階差分爲
對於2維離散狀況(圖像),拉普拉斯算子是2個維上二階差分的和(見式3.3),其公式爲:
上式對應的卷積核爲
經常使用的拉普拉斯核有:
拉普拉斯算子會突出像素值快速變化的區域,所以經常使用於邊緣檢測。
Matlab裏有兩個函數
1)del2
2)fspecial:圖像處理中通常利用Matlab函數fspecial
h = fspecial('laplacian', alpha) returns a 3-by-3 filter approximating the shape of the two-dimensional Laplacian operator.
The parameter alpha controls the shape of the Laplacian and must be in the range 0.0 to 1.0. The default value for alpha is 0.2.
http://fourier.eng.hmc.edu/e161/lectures/gradient/node8.html (很是清晰的Laplacian Operator介紹,本文的主要參考)
http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm
sift算法
尺度不變特徵轉換(Scale-invariant feature transform 或 SIFT)是一種電腦視覺的算法用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變量,此算法由 David Lowe 在1999年所發表,2004年完善總結。
Sift算法就是用不一樣尺度(標準差)的高斯函數對圖像進行平滑,而後比較平滑後圖像的差異,
差異大的像素就是特徵明顯的點。
sift能夠同時處理亮度,平移,旋轉,尺度的變化,利用特徵點來提取特徵描述符,最後在特徵描述符之間尋找匹配
五個步驟
1構建尺度空間,檢測極值點,得到尺度不變性
2特徵點過濾並進行經肯定位,剔除不穩定的特徵點
3 在特徵點處提取特徵描述符,爲特徵點分配方向直
4聲稱特徵描述子,利用特徵描述符尋找匹配點
5計算變換參數
當2幅圖像的sift特徵向量生成之後,下一步就能夠採用關鍵點特徵向量的歐式距離來做爲2幅圖像中關鍵點的類似性斷定量度
尺度空間:
尺度就是受delta這個參數控制的表示
而不一樣的L(x,y,delta)就構成了尺度空間,實際上具體計算的時候即便連續的高斯函數,都要被離散爲矩陣來和數字圖像進行卷積操做
L(x,y,delta)=G(x,y,e)*i(x,y)
尺度空間=原始圖像(卷積)一個可變尺度的2維高斯函數G(x,y,e)
G(x,y,e) = [1/2*pi*e^2] * exp[ -(x^2 + y^2)/2e^2]
爲了更有效的在尺度空間檢測到穩定的關鍵點,提出了高斯差分尺度空間,利用不一樣尺度的高斯差分核與原始圖像i(x,y)卷積生成
D(x,y,e)=(G(x,y,ke)-G(x,y,e))*i(x,y)
=L(x,y,ke)-L(x,y,e)
(爲避免遍歷每一個像素點)
高斯卷積:
在組建一組尺度空間後,再組建下一組尺度空間,對上一組尺度空間的最後一幅圖像進行二分之一採樣,獲得下一組尺度空間的第一幅圖像,而後進行像創建第一組尺度空間那樣的操做,獲得第二組尺度空間,公式定義爲
L(x,y,e) = G(x,y,e)*I(x,y)
圖像金字塔的構建:圖像金字塔共O組,每組有S層,下一組的圖像由上一組圖像降採樣獲得、
高斯差分
在尺度空間創建完畢後,爲了可以找到穩定的關鍵點,採用高斯差分的方法來檢測那些在局部位置的極值點,即採用倆個相鄰的尺度中的圖像相減,即公式定義爲:
圖像處理之卷積概念
咱們來看一下一維卷積的概念.
連續空間的卷積定義是 f(x)與g(x)的卷積是 f(t-x)g(x) 在t從負無窮到正無窮的積分值.t-x要在f(x)定義域內,因此看上去很大的積分實際上仍是在必定範圍的.
實際的過程就是f(x) 先作一個Y軸的反轉,而後再沿X軸平移t就是f(t-x),而後再把g(x)拿來,二者乘積的值再積分.想象一下若是g(x)或者f(x)是個單位的階越函數. 那麼就是f(t-x)與g(x)相交部分的面積.這就是卷積了.
把積分符號換成求和就是離散空間的卷積定義了.
那麼在圖像中卷積卷積地是什麼意思呢,就是圖像f(x),模板g(x),而後將模版g(x)在模版中移動,每到一個位置,就把f(x)與g(x)的定義域相交的元素進行乘積而且求和,得出新的圖像一點,就是被卷積後的圖像. 模版又稱爲卷積核.卷積核作一個矩陣的形狀.
卷積定義上是線性系統分析常常用到的.線性系統就是一個系統的輸入和輸出的關係是線性關係.就是說整個系統能夠分解成N多的無關獨立變化,整個系統就是這些變化的累加.
如 x1->y1, x2->y2; 那麼A*x1 + B*x2 -> A*y1 + B*y2 這就是線性系統. 表示一個線性系統能夠用積分的形式 如 Y = Sf(t,x)g(x)dt S表示積分符號,就是f(t,x)表示的是A B之類的線性係數.
看上去很像卷積呀,,對若是f(t,x) = F(t-x) 不就是了嗎.從f(t,x)變成F(t-x)其實是說明f(t,x)是個線性移不變,就是說 變量的差不變化的時候,那麼函數的值不變化. 實際上說明一個事情就是說線性移不變系統的輸出能夠經過輸入和表示系統線性特徵的函數卷積獲得.
http://dept.wyu.edu.cn/dip/DIPPPT2005/����������ϵͳ.ppt