依據畫素值的權重,分離影象前景和背景。
// 關鍵之處是處理畫素值的權重佔比
// otsu algorithm
int otsu(const mat src)
; // pixel gray value count
for (int i = 0; i < height; i++)}/*
* sum0:前景的灰度總和 sum1:背景灰度總和
* cnt0:前景畫素的總個數 cnt1:背景畫素的總個數
* w0: 前景畫素個數佔整幅影象畫素的比例
* w1: 背景畫素個數佔整幅影象畫素的比例
* u0: 前景的平均灰度 u1: 背景的平均灰度
* variance: 類間方差
*/long sum0 = 0, sum1 = 0;
long cnt0 = 0, cnt1 = 0;
double w0 = 0, w1 = 0;
double u0 = 0, u1 = 0;
double variance = 0;
/** u: 整幅影象的總平均灰度
* maxvariance: 最大類間方差
*/int i, j;
double u = 0;
double maxvariance = 0;
// 目標閾值
int threshold = 0;
// 依次遍歷每個畫素
for (i = 1; i < 256; i++)
// u0:前景平均灰度 w0:前景畫素點數量佔全部畫素點的比例
u0 = (double)(sum0 * 1.0 / cnt0);
w0 = (double)(cnt0 * 1.0 / size);
// 背景
for (j = i; j <= 255; j++)
// u1:背景平均灰度 w1:背景畫素點數占全部畫素點的比例
u1 = (double)(sum1 * 1.0 / cnt1);
w1 = 1 - w0;
// u:影象平均灰度 variancn:類間方差
//u = u0 * w0 + u1 * w1;
variance = w0 * w1 * (u0 - u1) * (u0 - u1);
if (variance > maxvariance)
}return (threshold);
}
影象分離可採用 opencv split()函式,將mat格式影象轉換為vector格式的影象。
合併r, g, b則採用相反的操作,使用opencv merge()函式,將vector格式的影象合併成mat格式的完整影象。
// splite input image
void thresholdbyotsu(const mat src, mat & dst)
輸入影象:
1. 美麗的lena女士
2. 原影象 r, g, b 三通道分離,依次輸出r,g,b單通道影象如下
3. otsu() 分別計算影象閾值得到r, g, b單通道閾值
channel
threshold
r113
g102
b162
3. 原影象r,g,b三通道,otsu閾值二值化,依次輸出如下影象
4. 將二值化的r,g,b三通道進行merge操作,輸出otsu的最終結果
see more
(全文完) otsu閾值分割演算法原理 閾值分割 Otsu法
演算法實現 不呼叫函式 include include using namespace std using namespace cv 實現灰度直方圖的繪製 void drawpicture mat inpicture,mat outpicture ma hist const int bins 256...
OTSU閾值分割
otsu演算法 1 原理 對於影象i x,y 前景 即目標 和背景的分割閾值記作t,屬於前景的畫素點數占整幅影象的比例記為 0,其平均灰度 0 背景畫素點數占整幅影象的比例為 1,其平均灰度為 1。影象的總平均灰度記為 類間方差記為g。假設影象的背景較暗,並且影象的大小為m n,影象中畫素的灰度值小...
OTSU閾值分割
在計算機視覺中我們常常關注的目標特徵是顏色和灰度,刻畫影象中的兩個區域視覺相似性有許多方法,如形狀描繪子,顏色特徵,距特徵等。對於某種場景下的應用,具有獨特的紋理物件可以使用乙個很好的紋理特徵符。針對顏色不同的區域中的單體物件相同的擴充套件,我們可以使用顏色特徵來測量物件的不用部分的相似性。如果物體...