在OpenCV的C++API中,所有的類和函數(shù)都在命名空間cv內(nèi)定義。訪問他們的方法共有兩種: (1)在定義main函數(shù)前使用如下聲明:
(2)是根據(jù)命名空間規(guī)范給所有OpenCV的類和函數(shù)加上前綴cv::,添加前綴后,代碼中OpenCV的類和函數(shù)將更容易識(shí)別。 highgui模塊中國(guó)有一批能幫助我們輕松顯示圖像并對(duì)圖像進(jìn)行操作的函數(shù)。
使用imread函數(shù)裝在圖像時(shí),通過設(shè)置選項(xiàng)把它轉(zhuǎn)化為灰度圖像,有些計(jì)算機(jī)視覺算法必須使用灰度圖像。在讀入圖像的同時(shí)進(jìn)行色彩轉(zhuǎn)換,可以提高運(yùn)行速度并減少內(nèi)存的使用。這樣生成的圖像由無符號(hào)字節(jié)(unsigned byte,c++中為unsigned char)構(gòu)成,在OpenCV中用常量CV_8U表示。
在這樣創(chuàng)建的圖像中,每個(gè)像素有3個(gè)字節(jié),OpenCV中用CV_8UC3表示。如果輸入的圖像文件是灰度圖像,這三個(gè)通道的值就是相同的。如果在讀入圖像時(shí)采用文件本身的格式,只需把第二個(gè)參數(shù)設(shè)置為負(fù)數(shù)。
可用channels方法檢查圖像的通道數(shù)。 注意:當(dāng)用imread打開路徑置頂不完整的圖像時(shí),imread會(huì)自動(dòng)采用默認(rèn)目錄: 如果從控制臺(tái)運(yùn)行程序,默認(rèn)路錄顯然就是當(dāng)前控制臺(tái)的目錄; 如果直接在IDE中運(yùn)行程序,默認(rèn)目錄就是項(xiàng)目文件所在的目錄(主函數(shù)文件所在目錄);
imshow顯示由整數(shù)(CV_16U表示16為無符號(hào)整數(shù),CV_32S表示32為有符號(hào)整數(shù))構(gòu)成的圖像時(shí),圖像每個(gè)像素會(huì)被除以256,以便能夠與在256級(jí)灰度中顯示。同樣在顯示由浮點(diǎn)數(shù)構(gòu)成的圖像時(shí),指的范圍會(huì)被假設(shè)為0.0(顯示黑色)~1.0(顯示白色)。超出這個(gè)范圍的值會(huì)被顯示為白色(大于1.0的值)或者黑色(小于0.0的值)。
回調(diào)函數(shù):響應(yīng)特定事件的時(shí)候被程序調(diào)用。為了能被程序識(shí)別,回調(diào)函數(shù)需要具備特定的簽名,并且必須注冊(cè)。
CV ::Mat類是用來存放圖像(以及其他矩陣數(shù)據(jù))的數(shù)據(jù)結(jié)構(gòu)。 一旦沒有了指定cv::Mat對(duì)象的引用,分配的內(nèi)存就會(huì)被自動(dòng)釋放。避免了C++動(dòng)態(tài)內(nèi)存分配中經(jīng)常發(fā)生的內(nèi)存泄漏問題。實(shí)現(xiàn)方法是通過cv::Mat實(shí)現(xiàn)計(jì)數(shù)引用和淺復(fù)制。深復(fù)制可以使用copyTo方法?;蛘弋a(chǎn)生一個(gè)圖像副本的方法clone。 把一幅圖像復(fù)制到另一幅圖像中,且兩者的數(shù)據(jù)類型不一定相同,那就要使用convertTo方法; 圖像掩碼: OpenCV中國(guó)的有些操作(copyTo)可以用來定義掩碼。函數(shù)或方法通常對(duì)圖像中所有的像素進(jìn)行操作,通過定義掩碼可以限制這些函數(shù)或方法的作用范圍。掩碼是一個(gè)8位圖像,如果掩碼中某個(gè)位置的值不為0,在這個(gè)位置上的操作就會(huì)起作用;如果為0,則不起作用。 操作像素: 椒鹽噪聲(salt-and-pepper noise):它隨機(jī)選擇一些像素,把他們的顏色替換成白色或者黑色。如果通信出錯(cuò),部分像素的值在傳輸時(shí)丟失,就會(huì)產(chǎn)生這種噪聲。 為了降低分析的復(fù)雜性,有時(shí)需要減少圖像多種顏色的數(shù)量。一種實(shí)現(xiàn)方法就是把RGB空間細(xì)分到大小相等的方塊中。例如,如果把每種顏色數(shù)量減少到1/8,那么顏色總數(shù)就變?yōu)榱?2*32*32.將舊圖像中的每個(gè)顏色值劃分到一個(gè)方塊,該方塊的中間值就是新的顏色值;新圖像使用新的顏色值,顏色數(shù)就減少了。 減色算法實(shí)現(xiàn):假設(shè)N是減色因子,將圖像中每個(gè)像素的值除以N(這里假設(shè)使用整數(shù)除法,不保留余數(shù))。然后將結(jié)果乘以N,得到N的倍數(shù),并且剛好不超過院士像素值。加上N/2,就得到相鄰的N倍數(shù)之間的中間值。對(duì)所有8位通道值重復(fù)這個(gè)過程,就會(huì)得到(256/N)*(256/N)*(256/N)種可能的顏色值。 其他減色算法:
減色計(jì)算也可以使用取模運(yùn)算符,可以直接得到div的倍數(shù):
還可以使用位運(yùn)算。如果把減色因子限定為2的指數(shù),即div = pow(2,n),那么把像素值的前n為掩碼后就能得到最接近的div的倍數(shù)。可以用簡(jiǎn)單的位操作獲得掩碼:
銳化濾波器:
在對(duì)像素領(lǐng)域進(jìn)行計(jì)算式,通常用一個(gè)核心矩陣來表示。這個(gè)核心矩陣展現(xiàn)了如何將于計(jì)算相關(guān)的像素組合起來得到預(yù)期的效果。 除非另有說明,當(dāng)前像素用核心矩陣中心單元格表示。核心矩陣中的每個(gè)單元格表示相關(guān)像素的乘法系數(shù),像素應(yīng)用核心矩陣得到的結(jié)果,即這些乘積的累加。核心矩陣的大小就是鄰域的大小。 根據(jù)銳化濾波器的要求,水平和垂直方向的四個(gè)相鄰像素與-1相乘,當(dāng)前像素與5相乘。這也是信號(hào)處理中卷積概念的基礎(chǔ)。
策略設(shè)計(jì)模式: 策略設(shè)計(jì)模式把算法封裝進(jìn)類,盡可能的將算法的復(fù)雜性隱藏在一個(gè)直觀的編程接口后面,更有利于算法的部署??梢酝ㄟ^創(chuàng)建類的實(shí)例來部署算法,實(shí)例通常是在程序初始化的時(shí)候創(chuàng)建的。在運(yùn)行構(gòu)造函數(shù)時(shí),類的實(shí)例會(huì)用默認(rèn)值初始化算法的各種參數(shù),使其立即進(jìn)入可用狀態(tài)。還可以用適當(dāng)?shù)姆椒▉碜x寫算法的參數(shù)值。 GrabCut算法: 背景/前景分割步驟:
GrabCut算法是一個(gè)逐步改進(jìn)分割結(jié)果的迭代過程。 CIEL*a*b顏色模型: 利用RGB色彩空間計(jì)算顏色之間的差距并不是衡量?jī)蓚€(gè)顏色相似度的最好方式。實(shí)際上,RGB并不是感知均勻的色彩空間。 CIEL*a*b*就是一種具有感知均勻特性的顏色表示法。把圖像轉(zhuǎn)換到這種表示法后,就可以真正的使用圖像像素與目標(biāo)顏色之間的歐幾里得距離,來度量顏色之間的視覺相似度。 使用OpenCV的函數(shù)cv::cvtColor可以輕松的轉(zhuǎn)換圖像的色彩空間。
CIEL*u*v*是另一種感知均勻的色彩空間。若想從BGR轉(zhuǎn)換成CIEL*u*v*,可使用代碼CV_BGR2Luv. L*a*b*和L*u*v*對(duì)亮度通道使用同樣的轉(zhuǎn)換公式,但對(duì)色度通道則使用不同的表示法。,另外,為了實(shí)現(xiàn)視覺感知上的均勻,這兩種色彩空間都扭曲了RGB的顏色范圍,所以這些轉(zhuǎn)換過程都是非線性的(不完全可逆)。 HSV和HLS這兩種色彩空間,把顏色分解成加值的色調(diào)和飽和度組件或亮度組件。用這種方式描述的顏色會(huì)更加自然。 把圖像的通道分割到三個(gè)獨(dú)立的圖像中,看到HSV的組件:
引入色調(diào)/飽和度/亮度的色彩空間概念:因?yàn)槿藗兿矚g憑直覺用色彩、彩度、亮度等直觀屬性來描述分辨各種顏色,色調(diào)(hue)表示主色,飽和度(saturation)表示顏色的鮮艷程度,柔和的顏色飽和度較低,而彩虹的顏色飽和度就很高;亮度(brightness)是一個(gè)主觀的屬性,表示某種顏色的光亮程度。 注意:如果顏色的飽和度很低,計(jì)算出來的色調(diào)就很不靠譜。7 膚色檢測(cè)領(lǐng)域的大量研究已經(jīng)表明:來自不同人種的人群的皮膚顏色,可以在色調(diào)-飽和度色彩空間中很好的歸類。
直方圖是一個(gè)簡(jiǎn)單的表格,表示一幅圖像(有時(shí)是一組圖像)中具有某個(gè)值的像素的數(shù)量。因此,灰度圖像的直方圖有256個(gè)項(xiàng)目。也叫箱子(bin)。0號(hào)箱子提供值為0的像素的數(shù)量,1號(hào)箱子提供值為1 的像素的數(shù)量,以此類推。如果把直方圖的所有箱子進(jìn)行累加,得到的結(jié)果就是像素的總數(shù)??梢园阎狈綀D歸一化,即所有箱子的累加和等于1。這時(shí),每個(gè)箱子的數(shù)值表示對(duì)應(yīng)的像素?cái)?shù)量占總數(shù)的百分比。 利用查找表修改圖像外觀: 1、對(duì)像素強(qiáng)度進(jìn)行簡(jiǎn)單的反轉(zhuǎn),即強(qiáng)度為0變成255、1變成254、255變成0,生成原始圖像的反向圖像。 2、定義一個(gè)修改原始圖像直方圖的查找表可以提高圖像的對(duì)比度。假設(shè)圖中根本沒有大于200的像素值??梢酝ㄟ^延伸直方圖來生成以個(gè)對(duì)比度更高的圖像。使用以個(gè)百分比閾值,在強(qiáng)度值中找到最小值和最大值,然后重新映射。 3、在彩色圖像上應(yīng)用查找表實(shí)現(xiàn)減色函數(shù)。 直方圖均衡化: 通過伸展直方圖使它布滿可用強(qiáng)度值的全部范圍,增強(qiáng)圖像對(duì)比度。但是很多時(shí)候,圖像的視覺缺陷并不因?yàn)樗氖褂玫膹?qiáng)度值范圍太窄,而是因?yàn)椴糠謴?qiáng)度值的使用頻率遠(yuǎn)高于其他強(qiáng)度值。因此,均衡對(duì)所有像素強(qiáng)度值的使用頻率可以作為提高圖像質(zhì)量的一種手段。(查找表是針對(duì)整幅圖像的多對(duì)一的轉(zhuǎn)換過程,所以直方圖是不能做到完全平穩(wěn)的。) 反向投影直方圖檢測(cè)特定圖像內(nèi)容: 假設(shè)需要在某幅圖像中檢測(cè)出特定的內(nèi)容,首先要做的就是選擇一個(gè)包含所需樣本的感興趣的區(qū)域。接著提取該ROI的直方圖,通過歸一化直方圖,可以得到一個(gè)函數(shù),得到特定強(qiáng)度值的像素屬于這個(gè)區(qū)域的概率。反向投影直方圖的過程:從歸一化后的直方圖中讀取概率值并把輸入圖像中的每個(gè)像素替換成與之對(duì)應(yīng)的概率值。(實(shí)驗(yàn)中除了云彩,其他區(qū)域也被錯(cuò)誤的檢測(cè)到了,這個(gè)概率函數(shù)是從簡(jiǎn)單的灰度直方圖提取的,很多其他像素的強(qiáng)度值域云彩像素的強(qiáng)度值是相同的,在對(duì)直方圖進(jìn)行反向投影時(shí)會(huì)用相同的概率值替換相同強(qiáng)度值的像素。還可以進(jìn)一步利用色彩信息提高檢測(cè)效果。) 均值偏移算法: 均值偏移算法是一個(gè)迭代過程,用于定位概率函數(shù)的局部最大值,方法是尋找預(yù)定義窗口內(nèi)部數(shù)據(jù)點(diǎn)的重心或加權(quán)平均值。然后,把窗口移動(dòng)到重心的位置,并重復(fù)該過程,知道窗口中心收斂到一個(gè)穩(wěn)定的點(diǎn)。OpenCV實(shí)現(xiàn)該算法定義了兩個(gè)停止條件:迭代次數(shù)達(dá)到最大值;窗口中心的偏移值小于某個(gè)限值,可認(rèn)為該位置收斂到一個(gè)穩(wěn)定點(diǎn)。 比較直方圖搜索相似圖像: 計(jì)算機(jī)視覺的重要課題:基于內(nèi)容的圖像檢索;而直方圖是標(biāo)識(shí)內(nèi)容的一種有效方式; 原理:逐個(gè)箱子的比較每個(gè)直方圖中的數(shù)值,并保存最小的值。然后把這些最小值累加,作為相似度測(cè)量值。(兩個(gè)沒有相同顏色的直方圖得到的交叉值為0 ,而兩個(gè)完全相同的直方圖得到的值就等于像素總數(shù)。) 其他算法:
積分圖像: 快速計(jì)算矩形區(qū)域內(nèi)的像素累加和; 原理:取矩形圖像左上方的全部像素計(jì)算累加和,并利用這個(gè)累加和替換圖像中的每一個(gè)像素,用這種方式得到的圖像稱為積分圖像。計(jì)算積分圖像時(shí),只需要對(duì)圖像掃描一次。實(shí)際上,當(dāng)前像素的積分值等于上方像素的積分值加上當(dāng)前行的累計(jì)值。因此積分圖像就是一個(gè)包含像素累加和的新圖像。為了防止溢出,積分圖像的值通常采用int類型(CV_32S)或float類型(CV_32F)。 積分圖像的像素A包含左上角區(qū)域,計(jì)算完積分圖像后,只需要訪問四個(gè)像素就可以得到任何矩形區(qū)域的像素累加和。計(jì)算有A、B、C、D四個(gè)像素表示區(qū)域的像素累加和,先讀取D的積分值,然后再減去B的像素值和C的左手邊區(qū)域的像素值。但這樣就把A左上角的像素累加和減了兩次,因此需要重新加上A的積分值。所以計(jì)算A、B、C、D區(qū)域內(nèi)的像素累加的公式為A-B-C+D。 自適應(yīng)閾值化: 即采用局部閾值,根據(jù)美國(guó)像素的鄰域計(jì)算閾值。將每個(gè)像素的值域鄰域的平均值進(jìn)行比較。如果某像素的值域它的局部平均值差別很大,就會(huì)被當(dāng)做異常值在閾值化過程中剔除。(自適應(yīng)閾值化需要計(jì)算每個(gè)像素周圍的局部平均值,這需要多次計(jì)算圖像窗口的累計(jì)值,可以通過積分圖像提高計(jì)算效率。) bug OpenCV的顏色空間轉(zhuǎn)換函數(shù): 參數(shù)dstCn原來一直沿用CV_BGR2GRAY, CV_RGB2GRAY, CV_GRAY2BGR, CV_GRAY2RGB等格式,但最新幾個(gè)版本的OpenCV已改為COLOR_BGR2GRAY類似形式,今天才看源代碼imgproc.hpp才發(fā)現(xiàn),但官方文檔還沒修改,如下圖,如果程序中使用較新的版本OpenCV,采用CV_BGR2GRAY可能會(huì)一直出錯(cuò)。 新的OpenCV中imgproc.hpp的定義如下:
解決:使用OpenCV3.4版本,導(dǎo)入opencv2
數(shù)學(xué)形態(tài)學(xué):用于分析和處理離散圖像。它定義了一系列運(yùn)算,用預(yù)先定義的形狀元素探測(cè)圖像,從而實(shí)現(xiàn)圖像的轉(zhuǎn)換。這個(gè)形狀元素與像素鄰域的相交方式?jīng)Q定了運(yùn)算的結(jié)果。 用形態(tài)學(xué)濾波器腐蝕(cv::erode)和膨脹(cv::dilate)圖像 結(jié)構(gòu)元素:像素的組合。在對(duì)應(yīng)的像素上定義了一個(gè)原點(diǎn)(也稱錨點(diǎn)) 形態(tài)學(xué)濾波器的應(yīng)用過程就包含了用這個(gè)結(jié)構(gòu)元素探測(cè)圖像中每個(gè)像素的操作過程。把某個(gè)像素設(shè)為結(jié)構(gòu)元素的原點(diǎn)后,結(jié)構(gòu)元素的圖像重疊部分的像素集就是特定形態(tài)學(xué)運(yùn)算的應(yīng)用對(duì)象。 用形態(tài)學(xué)濾波器開啟和閉合圖像 開啟和閉合濾波器的定義只與基本的腐蝕和膨脹運(yùn)算有關(guān); 定義: 閉合:是對(duì)圖像先膨脹后腐蝕;開啟:是對(duì)圖像先腐蝕后膨脹;
調(diào)換這兩個(gè)函數(shù)的調(diào)用次序,就能得到開啟濾波器;濾波器常用于目標(biāo)檢測(cè); 閉合濾波器:可以把錯(cuò)誤分裂成小碎片的物體連接起來; 開啟濾波器:可以移除因圖像噪聲產(chǎn)生的斑點(diǎn); 因此:最好按一定的順序調(diào)用這些濾波器。如果優(yōu)先考慮過濾噪聲,可以先開啟后閉合,但這樣做的壞處是會(huì)消除部分物體碎片; 注意:對(duì)同一幅圖像進(jìn)行多次同樣的開啟運(yùn)算是沒有作用的(閉合運(yùn)算也一樣),因?yàn)榈谝淮问褂瞄_啟濾波器時(shí)已經(jīng)填充了空隙,再使用同一個(gè)濾波器將不會(huì)使圖像產(chǎn)生變化。即這些運(yùn)算是冪等(idempotent)的。 形態(tài)學(xué)梯度運(yùn)算可以提取圖像的邊緣(cv::morpholgyEx函數(shù))得到圖像中物體的輪廓。
形態(tài)學(xué)頂帽(hat-top)變換可以從圖像中提取出局部的小型前景物體。(提取圖像中的文字)
形態(tài)學(xué)運(yùn)算在灰度圖像上的效果理解:
分水嶺算法實(shí)現(xiàn)圖像分割 分水嶺變換是一種流行的圖像處理算法,用于快速將圖像分割成多個(gè)同質(zhì)區(qū)域。 思想:如果把圖像看作一個(gè)擴(kuò)屏地貌,那么同類區(qū)域就相當(dāng)于陡峭邊緣內(nèi)相對(duì)平坦的盆地。平、分水嶺算法通過逐步增高水位,把地貌分割成多個(gè)部分。(cv::watershed函數(shù)) MSER算法提取特征區(qū)域 最大穩(wěn)定外部區(qū)域(MSER) 該算法用相同的水淹類比,以便從圖像中提取有意義的區(qū)域。創(chuàng)建這些區(qū)域時(shí)也使用逐步提高水位的方法,但是該算法關(guān)注的是水淹過程中的某段時(shí)間內(nèi),保持相對(duì)穩(wěn)定的盆地。這個(gè)穩(wěn)定的盆地就是MSER。檢測(cè)方法:計(jì)算區(qū)域的當(dāng)前面積以及該區(qū)域原先的面積(比當(dāng)前水位低一個(gè)特定值的時(shí)候),并比較這兩個(gè)面積,如果相對(duì)變化達(dá)到局部最小值,就認(rèn)為這個(gè)區(qū)域時(shí)MSER。
濾波是信號(hào)和圖像處理中的基本操作,它的目的是選擇性的提取圖像中某些方面的內(nèi)容;濾波可以去除圖像中的噪聲,提取有用的視覺特征,對(duì)圖像重新采樣。 頻域(frequency domain):圖像中灰度級(jí)的變化頻率;傅里葉變換或余弦變換顯示圖像的頻率成分; 圖像是二維的,因此,頻率分為:垂直頻率和水平頻率; 空域(spatial domain):灰度分布來描述圖像特征; 在頻域分析框架下,濾波器時(shí)一種放大(也可以不變)圖像中的某些頻段,同時(shí)濾掉(或減弱)其他頻段的算子。eg:低通濾波器的作用是消除圖像中的高頻部分;高通濾波器剛好相反,用來消除圖像中的低頻部分; 縮減像素采樣(downsampling):降低圖像精度的過程; 提升像素采樣(upsampling):提升圖像精度的過程; Nyquist-Shannon定理:如果把圖像縮小一半,那么其可見的頻率帶寬也將減少一半。為了避免混疊現(xiàn)象的發(fā)生,在縮減圖像之前必須進(jìn)行低筒濾波(低通濾波可以消除在縮減后的圖像中無法表示的高頻部分) 像素插值:進(jìn)行插值的最基本的方法是使用最近鄰策略。把待生成圖像的像素網(wǎng)格放在原圖像的上方,每個(gè)新像素被賦予原圖像中最鄰近像素的值。當(dāng)像素升采樣(即新網(wǎng)格比原始網(wǎng)格更密集時(shí)),會(huì)根據(jù)同一個(gè)院士像素,確定新網(wǎng)格中多個(gè)像素的值。 中值濾波器:因?yàn)橹兄禐V波器是非線性的,所以不能用核心矩陣表示,也不能進(jìn)行卷積運(yùn)算。但它也是通過操作一個(gè)像素的鄰域,來確定輸出的像素值的。(中值濾波器把當(dāng)前像素和它的鄰域組成一個(gè)集合,然后計(jì)算出這個(gè)集合的中間值,以此作為當(dāng)前像素的值)。 中值濾波器對(duì)消除椒鹽噪聲非常有用;因?yàn)?,如果在某個(gè)像素鄰域中有一個(gè)異常的黑色或白色像素,該像素將無法作為中間值(它是最大值或最小值),因此肯定會(huì)被鄰域的值替換掉。 中值濾波器還有利于保留邊緣的尖銳度,但它會(huì)洗去均質(zhì)區(qū)域中的紋理(例如背景中的樹木) 因?yàn)?strong>中值濾波器具有良好的視覺效果,因此照片編輯軟件常用它創(chuàng)建特效??梢杂貌噬掌深愃瓶ㄍǖ膱D像。 用定向?yàn)V波器檢測(cè)邊緣: 高通濾波器進(jìn)行邊緣檢測(cè):放大圖像中的高頻成分; Sobel濾波器:它只對(duì)垂直或水平方向的圖像頻率起作用(具體方向取決于濾波器選用的內(nèi)核)所以是一種定向?yàn)V波器。(圖像浮雕化的特效就是定向?yàn)V波器生成的)Sobel算子稱作邊緣檢測(cè)器,是一種典型的用于邊緣檢測(cè)的線性濾波器。如果把圖像看作二維函數(shù),那么Sobel算子就是圖像在垂直和水平方向變化的速度(梯度),它是一個(gè)二維向量,向量的元素時(shí)橫豎兩個(gè)方向的函數(shù)的一階導(dǎo)數(shù); Sobel算子在水平和垂直方向計(jì)算像素值的差分,得到圖像梯度的近似值。它在像素周圍的一定范圍內(nèi)進(jìn)行運(yùn)算,以減少噪聲帶來的影響。cv::Sobel函數(shù)使用Sobel內(nèi)核來計(jì)算圖像的卷積。 梯度是一個(gè)二維向量,所以它有范數(shù)和方向,梯度向量的范數(shù)表示變化的振幅,計(jì)算時(shí)通常被當(dāng)做歐幾里得范數(shù)(L2范數(shù))。 梯度向量總是指向變化最劇烈的方向。對(duì)于一幅圖像來說,這意味著梯度的方向與邊緣垂直; 梯度算子:Prewitt算子;Roberts算子;Scharr算子;所有的這些定向?yàn)V波器都會(huì)計(jì)算圖像函數(shù)的一階導(dǎo)數(shù)。計(jì)算圖像導(dǎo)數(shù)的濾波器被稱為高通濾波器。 拉普拉斯算子(cv::Laplacian):一種基于圖像導(dǎo)數(shù)運(yùn)算的高通線性濾波器,它通過計(jì)算二階導(dǎo)數(shù)來度量圖像函數(shù)的曲率; 用拉普拉斯算子增強(qiáng)圖像的對(duì)比度:通過圖像中減去它的拉普拉斯圖像,可以增強(qiáng)圖像的對(duì)比度; 高斯差分:用兩個(gè)不同帶寬的高斯濾波器對(duì)一幅圖像做濾波,然后將這兩個(gè)結(jié)果相減,就能得到由較高的頻率構(gòu)成的圖像。這些頻率被一個(gè)濾波器保留,被另一個(gè)濾波器拋棄。
要進(jìn)行基于內(nèi)容的圖像分析,就必須從構(gòu)成圖像的像素集中提取出有意義的特征:輪廓、直線、斑點(diǎn)等基本的圖像圖元; 用Canny算子檢測(cè)圖像輪廓 核心原理:用兩個(gè)不同的閾值來判斷哪個(gè)點(diǎn)屬于輪廓,一個(gè)是低閾值,一個(gè)是高閾值; 選擇低閾值:保證它能包含所有屬于重要圖像輪廓的邊緣像素。(由于使用了比較寬松的閾值,所以很多并不需要的邊緣也被檢測(cè)出來了) 選擇高閾值:作用就是界定重要輪廓的邊緣,排除掉異常的邊緣。(得到肯定屬于本場(chǎng)景中的重要輪廓) Canny算法將這兩種邊緣分布圖結(jié)合,生成最優(yōu)的輪廓分布圖(在低閾值邊緣分布圖上只保留具有連續(xù)路徑的邊緣點(diǎn),同時(shí)把那些邊緣點(diǎn)連接到屬于高閾值邊緣分布圖的邊緣上。)這種基于兩個(gè)閾值獲得二值分布圖的策略被稱為滯后閾值化; 用霍夫變換(Hough transform)檢測(cè)直線 在霍夫變換中,用這個(gè)方程式表示直線:
霍夫變換的目的是在二值圖像中找出全部直線,并且這些直線必須穿過足夠多的像素點(diǎn)。 處理方法:檢查輸入的二值分布圖中每個(gè)獨(dú)立的像素點(diǎn),識(shí)別出穿過該像素帶你的所有可能直線。如果同一條直線穿過很多像素點(diǎn),就說明這條直線明顯到足以被認(rèn)定。為了統(tǒng)計(jì)某條直線被標(biāo)識(shí)的次數(shù),霍夫變換使用了一個(gè)二維累加器。 霍夫變換也能用來檢測(cè)其他任何可以用一個(gè)參數(shù)方程來表示的物體,但一般來說參數(shù)越多,累加器的維數(shù)越多,霍夫變換就越復(fù)雜,可靠性也越低; 點(diǎn)集的直線擬合: 使每個(gè)點(diǎn)到直線的距離之和最小化(歐幾里得距離的計(jì)算速度最快),最小化計(jì)算的基礎(chǔ)是M估算法技術(shù),它采用迭代方式解決加權(quán)最小二乘法問題,其中權(quán)重與點(diǎn)到直線的距離成反比。 提取連續(xù)區(qū)域 原理:提取輪廓的算法,它系統(tǒng)的掃描圖像,直到找到連續(xù)區(qū)域。從區(qū)域的起點(diǎn)開始,沿著它的輪廓對(duì)邊界像素做標(biāo)記。處理完這個(gè)輪廓后,就從上個(gè)位置繼續(xù)掃描,直到發(fā)現(xiàn)新的區(qū)域。 計(jì)算區(qū)域的形狀描述子 連續(xù)區(qū)域通常代表著場(chǎng)景中的某個(gè)物體。為了識(shí)別該物體,或?qū)⑺c其他圖像元素作比較,需要對(duì)此區(qū)域進(jìn)行測(cè)量,以提取出部分特征。 邊界框: 在表示和定位圖像中區(qū)域的方法中,邊界框可能是最簡(jiǎn)潔的。 定義:能完整包含該形狀的最小垂直矩形。比較邊界框的高度和寬度,可以獲得物體在垂直或水平方向的特征,最小覆蓋圓通常在只需要區(qū)域尺寸和位置的近似值時(shí)使用; 如果要更緊湊的表示區(qū)域的形狀,可采用多邊形逼近。在創(chuàng)建時(shí)要制定精確度參數(shù),表示形狀與對(duì)應(yīng)的簡(jiǎn)化多邊形之間能接受的最大距離。
興趣點(diǎn)(關(guān)鍵點(diǎn)或特征點(diǎn)):在圖像中選取某些特征點(diǎn)并對(duì)圖像進(jìn)行局部分析(提取局部特征),而非觀察整幅圖像(提取全局特征)只要圖像中有足夠多可檢測(cè)的興趣點(diǎn),并且這些興趣點(diǎn)各不相同且特征穩(wěn)定、能被精確定位。 檢測(cè)圖像中的角點(diǎn) 在圖像中搜索有價(jià)值的特征點(diǎn)時(shí),使用角點(diǎn)是一種不錯(cuò)的方法。角點(diǎn)是很容易在圖像中定位的局部特征。并且大量存在于人造物體中,角點(diǎn)的價(jià)值在于它是兩條邊緣線的結(jié)合點(diǎn),是一種二維特征,可以被精確的檢測(cè),Harris特征檢測(cè)是檢測(cè)角點(diǎn)的經(jīng)典方法。 Harris特征檢測(cè):在假定的興趣點(diǎn)周圍放置了一個(gè)小窗口,并觀察窗口內(nèi)某個(gè)方向上強(qiáng)度值的平均變化; 首先獲得平均強(qiáng)度值變化最大的方向,然后檢查垂直方向上的平均強(qiáng)度變化值,看它是否也很大;如果是,就說明這是一個(gè)角點(diǎn);判斷一個(gè)點(diǎn)為角點(diǎn)的條件是它的協(xié)方差矩陣的最小特征值要大于指定的閾值。 快速檢測(cè)特征: FAST對(duì)角點(diǎn)的定義基于候選特征點(diǎn)周圍的圖像強(qiáng)度值。以某個(gè)點(diǎn)為中心做一個(gè)圓,根據(jù)圓上的像素值判斷該點(diǎn)是否為關(guān)鍵點(diǎn)。如果存在這樣一段圓弧,它的連續(xù)長(zhǎng)度超過周長(zhǎng)的3/4,并且它上面所有像素的強(qiáng)度值都與圓心的強(qiáng)度值明顯不同,那么久認(rèn)為這是一個(gè)關(guān)鍵點(diǎn)。 尺度不變特征的檢測(cè) SURF特征(加速穩(wěn)健特征)不僅是尺度不變特征,而且是具有較高計(jì)算效率的特征。是SIFT算法的加速版。SURT和SIFT是受專利保護(hù)的,在用于商業(yè)應(yīng)用程序是必須遵守許可協(xié)議。這也是它們被放在cv::xfeatures2d包中的原因之一。 多尺度FAST特征的檢測(cè) BRISK(二元穩(wěn)健恒定可擴(kuò)展關(guān)鍵點(diǎn))檢測(cè)法 ORB(定向FAST和旋轉(zhuǎn)BRIEF)檢測(cè)法 (原理基于每個(gè)被檢測(cè)的興趣點(diǎn)總是關(guān)聯(lián)了一個(gè)方向,ORB算法建議使用關(guān)鍵點(diǎn)周圍的圓形鄰域的重心方向。因?yàn)楦鶕?jù)定義,F(xiàn)AST關(guān)鍵點(diǎn)肯定有一個(gè)偏離中心點(diǎn)的重心,中心點(diǎn)與重心連線的角度重視非常明確) 這兩種可以實(shí)現(xiàn)快速可靠的圖像匹配,如果搭上相關(guān)的二值描述子,它們的性能可以進(jìn)一步提高。
局部模板匹配: 通過特征點(diǎn)匹配,可以將一幅圖像的點(diǎn)集和另一幅圖像(或一批圖像)的點(diǎn)集關(guān)聯(lián)起來。如果兩個(gè)點(diǎn)集對(duì)應(yīng)著現(xiàn)實(shí)世界中的同一個(gè)場(chǎng)景元素,它們就應(yīng)該是匹配的。 僅憑單個(gè)像素就判斷兩個(gè)關(guān)鍵點(diǎn)的相似度顯然是不夠的,因此要在匹配過程中考慮每個(gè)關(guān)鍵點(diǎn)周圍的圖像塊。如果兩幅圖像塊對(duì)應(yīng)著同一場(chǎng)景元素,那么它們的像素值應(yīng)該會(huì)比較相似。 最常見的圖像塊是邊長(zhǎng)為奇數(shù)的正方形,關(guān)鍵點(diǎn)的位置就是正方形的中心??赏ㄟ^比較塊內(nèi)像素的強(qiáng)度值來衡量?jī)蓚€(gè)正方形圖像塊的相似度。(常見的方案是采用簡(jiǎn)單的差的平方和(Sum of Squared Differents,SSD)先使用FAST檢測(cè)器檢測(cè)每幅圖像的關(guān)鍵點(diǎn)。 只要兩幅圖像的視角和光照都比較相似,僅用差值平方和來比較兩個(gè)圖像窗口也能得到較好的結(jié)果。 實(shí)際上,只要光照有變化,圖像塊中所有像素的強(qiáng)度值就會(huì)增強(qiáng)或降低,差值平方也會(huì)發(fā)生很大的變化。為了減少光照對(duì)匹配結(jié)果的影響,還可以采用衡量圖像窗口相似度的其他公式:如歸一化的差值平方和。 模板匹配: 圖像分析中的常見任務(wù)是檢測(cè)圖像中是否存在特定的圖案或物體。實(shí)現(xiàn)方法是把包含該物體的小圖像作為模板,然后在指定圖像上搜索與模板相似的部分。搜索的范圍通常僅限于可能發(fā)現(xiàn)該物體的區(qū)域。在這個(gè)區(qū)域上滑動(dòng)模板,并在每個(gè)像素位置計(jì)算相似度。
模板尺寸M×N,圖像尺寸為W×H,則結(jié)果矩陣的尺寸就是(W-M+1)×(H-N+1) 描述并匹配局部強(qiáng)度值模式: 在圖像分析中,可以用鄰域包含的視覺信息來標(biāo)識(shí)每個(gè)特征點(diǎn),以便區(qū)分各個(gè)特征點(diǎn)。特征描述子通常是一個(gè)N維向量,在光照變化和拍攝角度發(fā)生微小扭曲時(shí),它描述特征點(diǎn)的方式不會(huì)發(fā)生變化。通??梢杂煤?jiǎn)單的差值矩陣來比較描述子(歐幾里得距離)。
使用SURF和SIFT的特征和描述子可以進(jìn)行尺度無關(guān)的匹配。 1、交叉檢查匹配項(xiàng) 有一種簡(jiǎn)單的方法可以驗(yàn)證得到的匹配項(xiàng),即重新進(jìn)行同一個(gè)匹配過程,但在第二次匹配時(shí),將第二幅圖像的每個(gè)關(guān)鍵點(diǎn)逐個(gè)與第一幅圖像的關(guān)鍵點(diǎn)進(jìn)行比較。只有在兩個(gè)方向都匹配了同一對(duì)關(guān)鍵點(diǎn)(即兩個(gè)關(guān)鍵點(diǎn)互為最佳匹配)時(shí),才認(rèn)為是一個(gè)有效的匹配項(xiàng)。
2、比率檢驗(yàn)法 當(dāng)場(chǎng)景中有很多相似的物體,一個(gè)關(guān)鍵點(diǎn)可以與多個(gè)其他關(guān)鍵點(diǎn)匹配,錯(cuò)誤匹配項(xiàng)非常多,需要將其排除。因此需要找到兩個(gè)最佳的匹配項(xiàng)。循環(huán)遍歷每個(gè)關(guān)鍵點(diǎn)匹配項(xiàng),然后執(zhí)行比率檢驗(yàn)法。 3、匹配差值的閾值化 把描述子之間的差值太大的匹配項(xiàng)排除。(多個(gè)策略結(jié)合使用提升匹配效果)
計(jì)算圖像對(duì)的基礎(chǔ)矩陣: 我們知道,沿著三維點(diǎn)X和相機(jī)中心點(diǎn)之間的連線,可在圖像上找到對(duì)應(yīng)的點(diǎn)x。反過來,在三維空間中,與成像平面上的位置x對(duì)應(yīng)的腸鏡點(diǎn)可以位于線條上的任何位置。這說明如果要根據(jù)圖像中的一個(gè)點(diǎn)找到另一幅圖像中對(duì)應(yīng)的點(diǎn),就需要在第二個(gè)成像平面上沿著這條線的投影搜素。這條虛線稱為點(diǎn)x的對(duì)極線。它規(guī)定了兩個(gè)對(duì)應(yīng)點(diǎn)必須滿足的基本條件,即對(duì)于一個(gè)點(diǎn),在另一個(gè)視圖中與它匹配的點(diǎn)必須位于它的對(duì)極線上,并且對(duì)極線的準(zhǔn)確方向取決于兩個(gè)相機(jī)的相對(duì)位置。事實(shí)上,所有對(duì)極線組成的結(jié)構(gòu)決定了雙視圖系統(tǒng)的幾何形狀。 用RANSAC(隨機(jī)抽樣一致性)算法匹配圖像 計(jì)算兩幅圖像之間的單應(yīng)矩陣 仍然考慮三維點(diǎn)和它在相機(jī)中的影像之間的投影關(guān)系,會(huì)發(fā)現(xiàn)有兩種特殊情況,這種特殊的矩陣稱為單應(yīng)矩陣: 第一:同一場(chǎng)景中兩個(gè)視圖之間的差別只有(這是外部矩陣的第四列全部變?yōu)?,即沒有平移量),在這種特殊情況下,投影關(guān)系就變?yōu)榱?×3的矩陣。 第二:如果拍攝目標(biāo)是一個(gè)平面,也會(huì)出現(xiàn)類似的情況,這時(shí),可以假設(shè)仍能保持通用性,即平面上的點(diǎn)都位于Z=0的位置。場(chǎng)景點(diǎn)中值為0 的坐標(biāo)會(huì)消除掉投影矩陣的第三列,從而又變成一個(gè)3×3的矩陣。 在這種特殊情況下,世界坐標(biāo)系的點(diǎn)和它的影像之間是線性關(guān)系。由于該矩陣是可逆的,所以只要兩個(gè)視圖只是經(jīng)過了旋轉(zhuǎn)或者拍攝的是平面物體,那么就可以將一個(gè)視圖中的像素點(diǎn)與另一個(gè)視圖中的對(duì)應(yīng)的像素點(diǎn)直接關(guān)聯(lián)起來。單應(yīng)矩陣的格式為: 其中H是一個(gè)3×3矩陣。這個(gè)關(guān)系式包含了一個(gè)尺度因子,用s表示。計(jì)算得到這個(gè)矩陣后,一個(gè)視圖中的所有點(diǎn)都可以根據(jù)這個(gè)關(guān)系式轉(zhuǎn)換到另一個(gè)視圖。(注意,在使用單位矩陣關(guān)系式后,基礎(chǔ)矩陣就沒有意義了。) 檢測(cè)圖像中的平面目標(biāo) 采取的方法是檢測(cè)這個(gè)平面物體的特征點(diǎn),然后試著在圖像中匹配這些特征點(diǎn)。然后用魯棒匹配方案來驗(yàn)證這些匹配項(xiàng),但要基于單應(yīng)矩陣。如果有效匹配項(xiàng)的數(shù)量很多,就說明該平面目標(biāo)在當(dāng)前圖像中。 由于不知道圖像中目標(biāo)物體的大小,所以我們把目標(biāo)圖像轉(zhuǎn)換成一系列不同的尺寸,構(gòu)建成一個(gè)金字塔。除了這種方法,也可以采用尺度不變特征。 執(zhí)行三個(gè)步驟: 1、在輸入圖像中檢測(cè)興趣點(diǎn)。 2、將圖像與目標(biāo)金字塔總的每幅圖像進(jìn)行魯棒匹配,并把優(yōu)質(zhì)匹配項(xiàng)最多的那一層保留下來;如果這一層的匹配項(xiàng)小足夠多,就可以認(rèn)為已經(jīng)找到目標(biāo)。 3、使用得到的單應(yīng)矩陣和cv::getPerspectiveTransform函數(shù),把目標(biāo)中的四個(gè)角點(diǎn)重新投影到輸入圖像中。
相機(jī)標(biāo)定 相機(jī)標(biāo)定的基本原理是,確定場(chǎng)景中一系列點(diǎn)的三維坐標(biāo)并拍攝這個(gè)場(chǎng)景,然后觀測(cè)這些點(diǎn)再圖像上投影的位置。有了足夠多的三維點(diǎn)和圖像上對(duì)應(yīng)的二維點(diǎn),就可以根據(jù)投影方程推斷出準(zhǔn)確的相機(jī)參數(shù)。顯然,為了得到精確的結(jié)果,就要觀測(cè)盡可能多的點(diǎn)?!?】是對(duì)一個(gè)包含大量三維點(diǎn)的場(chǎng)景取像。但是在實(shí)際操作中,這種做法幾乎是不可行的。【2】更實(shí)用的做法是從不同的視角為一些三維點(diǎn)拍攝多個(gè)照片。但是它除了需要計(jì)算相機(jī)本身的參數(shù),還需要計(jì)算每個(gè)相機(jī)視圖的位置。
|
|