OTSU演算法(大津法—最大類間方差法)原理及實作
背景
大津法(OTSU)是一種確定影像二值化分割閾值的演算法,由日本學者大津于1979年提出,從大津法的原理上來講,該方法又稱作最大類間方差法,因為按照大津法求得的閾值進行影像二值化分割后,前景與背景影像的類間方差最大,
方差:

它是按影像的灰度特性,將影像分成背景和前景兩部分,因方差是灰度分布均勻性的一種度量,背景和前景之間的類間方差越大,說明構成影像的兩部分的差別越大,當部分前景錯分為背景或部分背景錯分為前景都會導致兩部分差別變小,
優點:
計算簡單,方便,不受影像的亮度的影響,在簡單雙峰場景中能進行快速分割
缺點:
噪聲的干擾大,當影像沒有典型的雙峰時,不能夠精確分割,對于多峰影像則失去效果,
應用:
醫學影像分割,目標識別等,常和其它演算法結合使用



基本原理:
OPENCV實作:
#include<opencv2/opencv.hpp>
#include<vector>
#include<iostream>
using namespace std;
using namespace cv;
void otsu(Mat input,Mat&output,int&thres)
{
const int Grayscale = 256;
int width = input.cols;
int height = input.rows;
double Graystatistics[Grayscale] = { 0 };
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width;j++)
{
int Grayvalue = input.at<uchar>(i, j);
Graystatistics[Grayvalue]++;//直方圖統計
}
}
double allnum = width * height;
double Pi[Grayscale] = { 0 };//單個個灰度的概率
double P[Grayscale] = { 0 };//累計灰度概率
double Mi[Grayscale] = { 0 };//累計灰度平均和
double Psum = 0;
double cumgray = 0;
for (int i = 0; i < Grayscale; i++)
{
Pi[i] = Graystatistics[i] / allnum;
P[i] = Pi[i] + Psum;
Psum = P[i];
Mi[i] = cumgray + (double)i * Pi[i];
cumgray = Mi[i];
}
//計算類間方差
double var = 0;
thres = 0;
for (int i = 0; i < Grayscale; i++)
{
double fenzi = (Mi[Grayscale - 1] * P[i] - Mi[i]) * (Mi[Grayscale - 1] * P[i] - Mi[i]);
double fenmu = P[i] * (1 - P[i]);
double vau = fenzi / fenmu;
if (vau > var)
{
var = vau;
thres = i;
}
}
cout << thres << endl;
input.copyTo(output);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int value = output.at<uchar>(i, j);
if (value >thres)
{
output.at<uchar>(i, j) = 255;
}
else
{
output.at<uchar>(i, j) = 0;
}
}
}
}
int main()
{
Mat a = imread("1.bmp");
cvtColor(a, a, COLOR_RGB2GRAY);
Mat b;
int th = 0;
otsu(a, b, th);
int Otsu1 = cv::threshold(a, b, 0, 255, THRESH_OTSU +THRESH_BINARY);
cout << Otsu1 << endl;
imshow("1", b);
return 0;
}
opencv介面:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
效果:


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423341.html
標籤:AI
上一篇:Nvidia顯卡+Anaconda虛擬環境+Pytorch安裝+Pycharm配置
下一篇:e代表的是什么
