目錄
- 什么是二值化
- 常見的求閾值演算法
- OSTU大津法
- 概念及原理
- iteration迭代法
- 概念及原理
- 代碼實作
- Sobel算子影像邊緣提取
- 概念及原理
- 代碼實作
- 噪點過濾
什么是二值化
所謂影像二值化,就是將256個亮度等級的灰度影像,通過適當的閾值選取而獲得仍然可以反映影像整體和區域特征的二值化影像,
由于我們用攝像頭拍到的影像為灰度影像,若直接處理會加大很多不必要的作業量,而將影像二值化,則可以使目標影像變得簡單且資料量小,同時又不丟失影像中的重要資訊,由此可見,在影像處理中,二值化步驟顯得尤為重要,
我們知道,二值化的步驟無非是將獲得的影像資料中大于閾值的像素點用255表示,而小于閾值的像素點用0表示,
那么如何選擇二值化所需的閾值,就成為了非常重要的一個步驟,
常見的求閾值演算法
OSTU大津法
概念及原理
OTSU演算法又稱為最大類間方差法,這是我們很常見的一種求閾值的方法,它的思路就是通過統計整個影像的直方圖特性來實作全域閾值T的自動選取,
該演算法進行前先設一個i作為分類閾值,通過歸一化的直方圖,統計影像中各個灰度級的像素占整幅影像的比例w0,并統計前景像素和背景像素的平均灰度u0和u1,和背景像素所占比例w1;通過公式g = w0w1(u0-u1) (u0-u1)計算前景像素和背景像素的方差 ,每進行完一次回圈i值加一,直道i=256時停止回圈,并將最大的g值作為影像閾值,
大津法二值化的代碼實作在網上比較多,這里不做詳細介紹,
iteration迭代法
概念及原理
迭代法也叫最小概率誤判法,它使用逐次逼近的思想,通過不斷更新迭代,求出滿足整幅影像偏差等級error的閾值,
具體步驟為:首先設定初始閾值T0和偏差等級,此閾值將影像分割為前景和背景,此時可以算出前景和背景的平均灰度值T1和T2,則新的最佳閾值為T_center=(T1+T2),將新閾值與上一個閾值比較,若兩者之差在偏差等級之內,則將標志位置為0,結束運算,得到的閾值極為當前閾值;若大于此偏差,則標志位置為1,繼續下一次回圈運算,由此逐漸逼近真實閾值,
代碼實作
do{
for(i=0;i<MT9V03X_H;i++)
{
for(j=0;j<MT9V03X_W;j++)
{
if(Im[i][j] < T2)
{
S0 += Im[i][j];
N0++; //像素點數統計
}
else
{
S1 += Im[i][j];
N1++; //像素點數統計
}
}
}
T1 = S0/N0; //平均灰度值
T2 = S1/N1; //平均灰度值
T_center = (T1+T2)/2;
if(abs(T_center - T0)> ERROR) flag = 1;
else flag = 0;
T0 =T_center;
BlackThres = T0;
} while(flag);
迭代法的空間復雜度較高,且光照越強受到的影響越強,
Sobel算子影像邊緣提取
概念及原理
索貝爾算子是計算機視覺領域的一種重要處理方法,主要用作邊緣檢測,索貝爾算子是把影像中每個像素的上下左右四領域的灰度值加權差,在邊緣處達到極值從而檢測邊緣,
運算時我們對影像中每一點使用此算子,將會產生對應的梯度矢量或是其法矢量,
索貝爾算子包含兩組3*3矩陣(橫向與縱向),具體如下:(圖源百度百科)

運算時將影像上每一點與其做平面卷積,即可分別得出橫向及縱向的亮度差分近似值,公式如下:

再將Gx與Gy相加,即為該像素點的近似灰度大小,
最后我們可以使用像素點之和的一定比例,作為該影像閾值 ,
代碼實作
for (i = yStart; i < yEnd; i++)
{
for (j = xStart; j < xEnd; j++)
TempX=(- mt9v03x_image[i-1][j-1])
+(-2*mt9v03x_image[i ][j-1])
+(- mt9v03x_image[i+1][j-1])
+( mt9v03x_image[i-1][j+1])
+( 2*mt9v03x_image[i ][j+1])
+( mt9v03x_image[i+1][j+1]);
TempY=( mt9v03x_image[i+1][j-1])
+( 2*mt9v03x_image[i+1][j ])
+( mt9v03x_image[i+1][j+1])
+(- mt9v03x_image[i-1][j-1])
+(-2*mt9v03x_image[i-1][j ])
+(- mt9v03x_image[i-1][j+1]);
temp=abs(tempx)+abs(tempy);
if(temp>255) temp=255;
Image_Sobel[i][j]=temp;
}
這種方法對陽光的適應性較好,空間復雜度也不大,是目前一種比較好的閾值演算法,
噪點過濾
索貝爾算子有著較好的檢測效果,并且對噪聲具有平滑抑制的作用,但其得到的邊緣較粗,且可能出現偽邊緣,所以我們需要對其噪點進行過濾,
for (nr = 1; nr < LCDH - 1; nr++)
{
for (nc = 1; nc < LCDW - 1; nc = nc + 1)
{
if(WhitePixle(i,j) && mt9v03x_image[i][j]>threshold)
Image_Sobel[i][j] = 0xFE;
if( BlackPixle(i-1,j-1)&&BlackPixle(i-1,j)&&BlackPixle(i-1,j+1)&&
BlackPixle(i,j-1)&&BlackPixle(i,j+1)&&WhitePixle(i,j)&&
BlackPixle(i+1,j-1)&&BlackPixle(i+1,j)&&BlackPixle(i+1,j+1))
Image_Sobel[i][j] = 0xFE;
}
}
總結到這里就告一段落了,自我小結的同時,也希望或多或少可以對大家有所幫助
如有疑問或錯誤,歡迎和我私信交流指正,
W.By Xyq
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254934.html
標籤:其他
上一篇:第一次機房配置總結
下一篇:2021-01-29
