大津アルゴリズムは、日本の学者によって効率的なアルゴリズム大津ある画像二値化のために1979年に提唱しました。以下は、OpenCVの大津コード(OpenCVのバージョン3.0)を閾値処理のC ++インプリメンテーションです。
ヘッダー:
書式#include <stdio.hに>
書式#include <文字列>
#include "opencv2 /のHighGUI / highgui.hpp"
#include "opencv2 / opencv.hpp"
名前空間stdを使用。
名前空間の品種を使用しました。
大津法函数:
int型大津(CV ::マットsrcImage)
{
int型NCOLS = srcImage.cols。
int型NROWS = srcImage.rows。
int型のしきい値= 0;
//統計パラメータを初期化します
int型nSumPix [256]。
フロートnProDis [256]。
以下のために(int型私= 0;私<256; I ++)
{
[I] = 0 nSumPix。
nProDis [I] = 0;
}
//画像全体の各画素の階調数を数えます
以下のために(; I <NCOLS; int型私は0を= I ++)
{
以下のための(int型J = 0; jの<NROWSあり、j ++)
{
nSumPix [(INT)srcImage.at <UCHAR>(i、j)は] ++;
}
}
グレーレベル分布を表す各画像について算出//確率
以下のために(int型私= 0;私<256; I ++)
{
nProDis [I] =(FLOAT)nSumPix [I] /(NCOLS * NROWS)。
}
//反復階調[0、255]、算出した閾値大津
フロートW0、W1、u0_temp、u1_temp、U0、U1、delta_temp。
二重delta_max = 0.0。
以下のために(int型私= 0;私<256; I ++)
{
//初期化パラメータ
W0 = W1 = u0_temp = u1_temp = U0 = U1 = delta_temp = 0。
以下のための(int型J = 0; jの<256; J ++)
{
//背景セクション
もし(J <= I)
{
//私は現在のセグメント化閾値、第一のタイプの合計確率であります
W0 + = nProDis [J]。
u0_temp + = J * nProDis [J]。
}
//見通しセクション
他
{
//私は現在のセグメント化閾値、第一のタイプの合計確率であります
W1 + = nProDis [J]。
u1_temp + = J * nProDis [J]。
}
}
灰色のすべての種類の//計算平均
U0 = u0_temp / W0;
U1 = u1_temp / W1;
delta_temp =(フロート)(W0 * W1 * POW((U0 - U1)、2))。
//順序が最大のカテゴリー間の分散のしきい値を見つけるために
もし(delta_temp> delta_max)
{
delta_max = delta_temp。
しきい値= I;
}
}
しきい値を返します。
}
大津関数呼び出し:
メインint型()
{
そして、画像読取を決定する//
CV ::マットsrcImage = CV ::関数imread( "SrcImage.jpg");
(もし!srcImage.data)
1を返します。
//階調変換
CV ::マットsrcGray。
CV :: cvtColor(srcImage、srcGray、CV_RGB2GRAY)。
CV ::関数imshow( "srcGray"、srcGray)。
大津の二値化アルゴリズム//呼び出しがしきい値を取得します
int ostuThreshold = OTSU(srcGray);
std :: coutの<< ostuThreshold <<はstd ::てendl;
//出力画像の定義
CV ::マットotsuResultImage =
CV ::マット::ゼロ(srcGray.rows、srcGray.cols、CV_8UC1)。
//バイナリ操作のための閾値を用いて得られます
以下のために(; I <srcGray.rows; int型私は0を= I ++)
{
以下のための(int型J = 0; jの<srcGray.colsあり、j ++)
{
//セットは、閾値255 ostuThreshold以上を満たすために
もし(srcGray.at <UCHAR>(i、j)は> ostuThreshold)
otsuResultImage.at <UCHAR>(i、j)は= 255;
他
otsuResultImage.at <UCHAR>(I、J)= 0。
}
}
CV ::関数imshow( "ResultImage"、otsuResultImage)。
CV :: waitKey(0);
0を返します。
}