❶ surf演算法C語言編寫,要做嵌入式開發,不要C++和基於OPENCV的
surf借鑒了sift中簡化近似的思想,將DOH中的高斯二階微分模板進行了近似簡化,使得模板對圖像的濾波只需要進行幾個簡單的加減法運算,並且,這種運算與濾波模板的尺寸有關。實驗證明surf演算法較sift演算法在運算速度上要快3倍左右。
1積分圖像
surf演算法中要用到積分圖像的概念。藉助積分圖像,圖像與高斯二階微分模板的濾波轉化為對積分圖像的加減運算。積分圖像(IntegralImage)的概念是由viola和Jones提出來的,而將類似積分圖像用於盒子濾波是由Simard等人提出。
積分圖像中任意一點(i,j)的值為ii(i,j)為原圖像左上角到任意點(i,j)相應的對角線區域灰度值的總和即:
公式中,I(x`,y`)表示原圖像中點(i`,j`)的灰度值,ii(x,y)可以由下面兩公式迭代計算得到:
公式中,S(x,y)表示一列的積分,且S(i,-1)=0,ii(-1,j)=0.求積分圖像,只需對原圖像的所有像素素進行一遍掃描。下面的代碼為c++語言的實現
pOutImage[0][0]=pInImage[0][0];
for(intx=1,x<nWidth;i++)
{
pOutImage[x][0]=pInImage[x-1][0]+pInImage[x][0];
}
for(inty=1;y<nHeight;y++)
{
intnSum=0;
for(intx=0;x<nWidth;x++)
{
nSum=pInImage[x][y];
pOutImage[x][y]=pInImage[x][y-1]+nSum;
}
}
如圖表示,在求取窗口w內的像元灰度和時,不管窗口W的大小如何,均可利用積分圖像的4個對應點(i1,j1)(i2,j2)(i3,j3)(i4,j4)的值計算的到。也就是說,求取窗口W內的像元灰度和與窗口的尺寸是無關的。窗口W內的像元的灰度和為
Sum(W)=ii(i4,j4)-ii(i2,j2)-ii(i3,j3)+ii(i1,j1)
下面看以截圖,相信都可以看懂
關於矩形區域內像素點的求和應該是一種簡單重復性運算,採用這種思路總體上提高了效率。為什麼這么說呢?假設一幅圖片共有n個像素點,則計算n個位置的積分圖總共的加法運算有n-1次(注意:可不是次哦,要充分利用遞推思想),將這些結果保存在一個跟原圖對應的矩陣M中。當需要計算圖像中某個矩形區域內的所有像素之和是直接像查表一樣,調出A,B,C,D四點的積分圖值,簡單的加減法(注意只需要三次哦)即可得到結果。反之,如果採用naive的方式直接在原圖像中的某個矩形區域內求和,你想想,總共可能的矩形組合有多少?!!且對於一幅圖像n那是相當大啊,所以2^n
那可是天文數字,而且這裡面絕大部分的矩形有重疊,重疊意味著什麼?在算求和的時候有重復性的工作,其實我們是可以有效的利用已經計算過的信息的。這就是積分圖法的內在思想:它實際上是先計算n個互不重疊(專業點說是不相交)的矩形區域內的像素點求和,充分利用這些值(已有值)計算未知值,有點類似遞推的味道...這就完全避免了重復求和運算。
這樣就可以進行2種運算:
(1)任意矩形區域內像素積分。由圖像的積分圖可方便快速地計算圖像中任意矩形內所有像素灰度積分。如下圖2.3所示,點1的積分圖像ii1的值為(其中Sum為求和):
ii1=Sum(A)
同理,點2、點3、點4的積分圖像分別為:
ii2=Sum(A)+Sum(B);ii3=Sum(A)+Sum(C);ii4=Sum(A)+Sum(B)+Sum(C)+Sum(D);
矩形區域D內的所有像素灰度積分可由矩形端點的積分圖像值得到:
Sum(D)=ii1+ii4-(ii2+ii3)(1)
(2)特徵值計算
矩形特徵的特徵值是兩個不同的矩形區域像素和之差,由(1)式可以計算任意矩形特徵的特徵值,下面以圖2.1中特徵原型A為例說明特徵值的計算。
如圖2.4所示,該特徵原型的特徵值定義為:
Sum(A)-Sum(B)
根據(1)式則有:Sum(A)=ii4+ii1-(ii2+ii3);Sum(B)=ii6+ii3-(ii4+ii5);
所以此類特徵原型的特徵值為:
(ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)
另示:運用積分圖可以快速計算給定的矩形之所有象素值之和Sum(r)。假設r=(x,y,w,h),那麼此矩形內部所有元素之和等價於下面積分圖中下面這個式子:
Sum(r)=ii(x+w,y+h)+ii(x-1,y-1)-ii(x+w,y-1)-ii(x-1,y+h)
由此可見,矩形特徵特徵值計算只與此特徵端點的積分圖有關,而與圖像坐標值無關。對於同一類型的矩形特徵,不管特徵的尺度和位置如何,特徵值的計算所耗費的時間都是常量,而且都只是簡單的加減運算。其它類型的特徵值計算方法類似。
❷ OpenCV-python系列六:圖像濾波
圖像濾波是一種十分常見的圖像處理手段。通常,你可以認為相鄰位置像素是緊密聯系的,它們共同來顯示對某個物體,圖像濾波則通過運算來排除圖像中和周圍相差大的像素。當然,這並不是絕對的, 有時候你為了評估圖像的質量,也會將這些「特立獨行」的像素作為選取的目標 。無論你採用什麼方法,記住你要的目標就行,有時候你的目標可能是別人的背景。
濾波常常會使得圖像變得模糊(非絕對),那麼,為什麼你需要將一幅清晰的圖像變得模糊呢?下面的例子應該可以解釋。
高斯濾波採用滿足正態分布的核模板,其參數的主要參數是標准差σ,代表核的離散程度,σ值越小,模板中心系數與邊緣系數差越大,平滑的程度越小。
高斯濾波對圖像採集過程中由於不良照明/高溫引起的感測器雜訊信號有較好的效果,消除了圖像中的高頻信號。
由於得到的是一維的Gaussian Kernel,你可以採用下面的方式轉為二維的
為了便於直觀感受高斯濾波的效果,使用Canny運算元來提取輪廓對比,你可以試試在特徵提取前加高斯濾波對比。
補充說明:對於均值濾波,你也可以使用cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])來實現,需要將normalize設置為True,當設置normalize為False時,實現的是將kernel內像素相加,官方文檔做出的描述為:
中值濾波對圖像中的脈沖型(椒鹽等)雜訊信號處理效果好,當 你的應用場景存在這種顆粒感的雜訊信號時,中值濾波會是一種很好的選擇 。它,選取kernel區域內像素點集的中值最為錨點的像素值,對類似投票機制中的最高分(高灰階點)和最低分(過低灰階點)影響有很好的抑製作用。
如果你的應用涉及到圖像美化,雙邊濾波可以初步達到你的期望,關於雙邊濾波,這里不做展開,由你來探索,其函數參數信息如下。
對於opencv-python的圖像濾波部分有問題歡迎留言, Have Fun With OpenCV-Python, 下期見。
❸ 圖像處理之雙邊濾波演算法
雙邊濾波是一種非線性的濾波方法,是結合圖像的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的,具有簡單、非迭代、局部處理的特點。之所以能夠達到保邊去噪的濾波效果是因為濾波器由兩個函數構成:
一個函數是像素歐式距離決定濾波器模板的系數,另一個是由像素的灰度差值決定濾波器模板的系數。
其綜合了高斯濾波器(Gaussian Filter)和α-截尾均值濾波器(Alpha-Trimmed mean Filter)的特點。高斯濾波器只考慮像素間的歐式距離,其使用的模板系數隨著和窗口中心的距離增大而減小;Alpha截尾均值濾波器則只考慮了像素灰度值之間的差值,去掉α%的最小值和最大值後再計算均值。
雙邊濾波器使用二維高斯函數生成距離模板,使用一維高斯函數生成值域模板。
雙邊濾波器中,輸出像素的值依賴於鄰域像素的值的加權組合,其公式如下:
其中(k,l)為模板窗口的中心坐標;(i,j)為模板窗口的其他系數的坐標;σd為高斯函數的標准差。 使用該公式生成的濾波器模板和高斯濾波器使用的模板是沒有區別的。
值域模板系數的生成公式如下:
其中,函數f(x,y)表示要處理的圖像,f(x,y)表示圖像在點(x,y)處的像素值;(k,l)為模板窗口的中心坐標;(i,j)為模板窗口的其他系數的坐標;σr為高斯函數的標准差。
將上述兩個模板相乘就得到了雙邊濾波器的模板,其公式如下:
❹ 高斯濾波的演算法原理
高斯濾波實質上是一種信號的濾波器,其用途是信號的平滑處理,人們知道數字圖像用於後期應用,其雜訊是最大的問題,由於誤差會累計傳遞等原因,很多圖像處理教材會在很早的時候介紹Gauss濾波器,用於得到信噪比SNR較高的圖像(反應真實信號)。與此相關的有Gauss-Laplace變換,其實就是為了得到較好的圖像邊緣,先對圖像做Gauss平滑濾波,剔除雜訊,然後求二階導矢,用二階導的過零點確定邊緣,在計算時也是頻域乘積=>空域卷積。
濾波器就是建立的一個數學模型,通過這個模型來將圖像數據進行能量轉化,能量低的就排除掉,雜訊就是屬於低能量部分。
若使用理想濾波器,會在圖像中產生振鈴現象。採用高斯濾波器的話,系統函數是平滑的,避免了振鈴現象。