1. 程式人生 > >理解影象特徵

理解影象特徵

目標

本節我會試著幫你理解什麼是影象特徵,為什麼影象特徵很重要,為什麼角點很重要等。

1 解釋 我相信你們大多數人都玩過拼圖遊戲吧。首先你們拿到一張圖片的一堆碎片,要做的就是把這些碎片以正確的方式排列起來從而重建這幅影象。問題是,你怎樣做到的呢?如果把你做遊戲的原理寫成計算機程式,那計算機就也會玩拼圖遊戲了。如果計算機可以玩拼圖,我們就可以給計算機一大堆自然圖片,然後就可以讓計算機把它拼成一張大圖了。如果計算機可以自動拼接自然圖片,那我們是不是可以給計算機關於一個建築的的大量圖片,然後讓計算機給我們建立一個3D 的的模型呢?

問題和聯想可以無邊無際。但是所有的這些問題都是建立在一個基礎問題之上的。這個問題就是:我們是如何玩拼圖的?我們是如何把一堆碎片拼在一起的?我們有時如何把一個個自然場景拼接成一個單獨影象的?

答案就是:我們要尋找一些唯一的特徵,這些特徵要適於被跟蹤,容易被比較。如果我們要定義這樣一種特徵,雖然我們知道它是什麼但很難用語言來描述。如果讓你找出一個可以在不同圖片之間相互比較的好的特徵,你肯定能搞定。這就是為什麼小孩子也會玩拼圖的原因。我們在一副影象中搜索這樣的特徵,我們能找到它們,而且也能在其他影象中找到這些特徵,然後再把它們拼接到一塊。(在拼圖遊戲中,我們更注重的是圖片之間的連續性)。我們的這些能力都是天生的。

所以我們的一個問題現在擴充套件成了幾個,但是更加確切了。這些特徵是什麼呢?(我們的答案必須也能被計算機理解)。

好吧,很難說人是怎樣找出這些特徵的。這些能力已經刻在我們的大腦中了。但是如果我們深入的觀察一些影象並搜尋不同的pattern,我們會發現一些有趣的事。一下圖為例:

影象很簡單。在影象的上方給出了六個小圖。你要做的就是找到這些小圖在原始影象中的位置。你能找到多少正確結果呢? A 和B 是平面,而且它們的影象中很多地方都存在。很難找到這些小圖的準確位置。

C 和D 更簡單。它們是建築的邊緣。你可以找到它們的近似位置,但是準確位置還是很難找到。這是因為:沿著邊緣,所有的地方都一樣。所以邊緣是比平面更好的特徵,但是還不夠好(在拼圖遊戲中要找連續的邊緣)。 最後E 和F 是建築的一些角點。它們能很容易的被找到。因為在角點的地方,無論你向哪個方向移動小圖,結果都會有很大的不同。所以可以把它們當成一個好的特徵。為了更好的理解這個概念我們舉個更簡單的例子。

如上圖所示,藍色框中的區域是一個平面很難被找到和跟蹤。無論你向那個方向移動藍色框,長的都一樣。對於黑色框中的區域,它是一個邊緣。如果你沿垂直方向移動,它會改變。但是如果沿水平方向移動就不會改變。而紅色框中的角點,無論你向那個方向移動,得到的結果都不同,這說明它是唯一的。所以,基本上來說角點是一個好的影象特徵。(不僅僅是角點,有些情況斑點也是好的影象特徵)。

現在我們終於回答了前面的問題了,“這些特徵是什麼?”。但是下一個問題又來了。我們怎樣找到它們?或者說我們怎樣找到角點?我們也已經用一種直觀的方式做了回答,比如在影象中找一些區域,無論你想那個方向移動這些區域變化都很大。在下一節中我們會用計算機語言來實現這個想法。所以找到影象特徵的技術被稱為特徵檢測

現在我們找到了影象特徵(假設你已經搞定)。在找到這些之後,你應該在其他影象中也找到同樣的特徵。我們應該怎麼做呢?我們選擇特徵周圍的一個區域,然後用我們自己的語言來描述它,比如“上邊是藍天,下邊是建築,在建築上有很多玻璃等”,你就可以在其他圖片中搜索相同的區域了。基本上看來,你是在描述特徵。同樣,計算機也要對特徵周圍的區域進行描述,這樣它才能在其他影象中找到相同的特徵。我們把這種描述稱為特徵描述。當你有了特徵很它們的描述後,你就可以在所有的影象中找這個相同的特徵了,找到之後你就可以做任何你想做的了。

本章我們就是要使用OpenCV 中的各種演算法來查詢影象的特徵,然後描述它們,對它們進行匹配等。