演算法實現(不呼叫函式)
#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 前...