otsu閾值分割演算法原理 閾值分割 Otsu法

2021-10-16 14:57:51 字數 2635 閱讀 6395

演算法實現(不呼叫函式)

#include

#include

using namespace std;

using namespace cv;

//實現灰度直方圖的繪製

void drawpicture(mat &inpicture, mat &outpicture)

ma*** hist;

const int bins = 256;

int hist_size = ;

float range = ;

const float* ranges = ;

int channels = ;

calchist(&inpicture, 1, channels, mat(), hist, 1, hist_size, ranges, true, false);

double maxnum;

minmaxloc(hist, 0, &maxnum, 0, 0);

int scale = 1;

int histheight = 256;

for (int i = 0; i < bins; i++)

float binvalue = hist.at(i);

int height = cvround(binvalue*histheight / maxnum);

// 繪製長方形

rectangle(outpicture, point(i*scale, histheight), point((i + 1)*scale, histheight - height), scalar(255));

namedwindow("windown", cv_window_normal);

imshow("windown", outpicture);

int main()

//以灰度方式讀入

double max = 0.0; //方差

int otsu = 0; //閾值

//得到畫素點總個數

int h = img.rows;

int w = img.cols;

int num = h * w;

//宣告乙個一維陣列,用來記錄各畫素級的個數

int m[256];

for (int i = 0; i < 256; i++)

m[i] = 0;

//mat m(256, cv_8u, m);

for (int i = 0; i < h; i++)

for (int j = 0; j < w; j++)

int temp = img.at(i, j);

m[temp]++;

//小於等於t的和大於t的畫素出現的概率和平均灰度

int t;//將閾值從0-255依次遍歷,尋找結果最好的

double outcome[256];//存放閾值為i的類間方差

for (t = 0; t < 256; t++)

double w0=0.0;//小於等於t的畫素出現的概率

double w1= 0.0;//大於t的畫素出現的概率

double u0= 0.0;// 平均灰度

double u1= 0.0;// 平均灰度

double sum1 = 0.0;

double sum2 = 0.0;

for (int i = 0; i <= t; i++)

sum1 += m[i];

w0 = sum1 / num; //小於等於t的畫素出現的概率,應該是double型別,後面再說

w1 = 1 - w0; //大於t的畫素出現的概率,應該是double型別,後面再說

sum1 = 0;

for (int i = 0; i <= t; i++)

sum1 += i * m[i];

u0 = sum1 / num / w0;

for (int i = t + 1; i < 256; i++)

sum2 += i * m[i];

u1 = sum2 / num / w1;

//暫存結果

outcome[t] = w0 * w1*(u0 - u1)*(u0 - u1);

//求最大類間方差

for (int i = 0; i < 256; i++)

if (max < outcome[i])

max = outcome[i];

otsu = i;

//輸出原影象

namedwindow("img",cv_window_normal);

imshow("img", img);

//輸出灰度直方圖

mat grayimg = mat::zeros(256, 256, cv_8uc1);

std::string grayimgwin;

drawpicture(img, grayimg);

cout << "閾值: " << otsu << endl;

cout << "最大類間方差: " << max << endl;

waitkey();

return 0;

OTSU閾值分割

otsu演算法 1 原理 對於影象i x,y 前景 即目標 和背景的分割閾值記作t,屬於前景的畫素點數占整幅影象的比例記為 0,其平均灰度 0 背景畫素點數占整幅影象的比例為 1,其平均灰度為 1。影象的總平均灰度記為 類間方差記為g。假設影象的背景較暗,並且影象的大小為m n,影象中畫素的灰度值小...

OTSU閾值分割

在計算機視覺中我們常常關注的目標特徵是顏色和灰度,刻畫影象中的兩個區域視覺相似性有許多方法,如形狀描繪子,顏色特徵,距特徵等。對於某種場景下的應用,具有獨特的紋理物件可以使用乙個很好的紋理特徵符。針對顏色不同的區域中的單體物件相同的擴充套件,我們可以使用顏色特徵來測量物件的不用部分的相似性。如果物體...

OTSU演算法 三通道閾值分割

依據畫素值的權重,分離影象前景和背景。關鍵之處是處理畫素值的權重佔比 otsu algorithm int otsu const mat src pixel gray value count for int i 0 i height i sum0 前景的灰度總和 sum1 背景灰度總和 cnt0 前...