一維Otsu演算法的原理與實現

2021-08-09 13:06:42 字數 2451 閱讀 9324

1.簡介:

一維otsu演算法也叫最大類間方差法,是由日本學者大津(nobuyuki otsu)於2023年提出的,

是一種影象灰度自適應閾值的分割演算法,間稱

otsu。

2.演算法思想:

根據影象灰度值的特性,將影象分成背景和前景2個部分。背景和前景之間的類間方差越大, 說明

構成影象的2部分的差別

越大,當部分前景錯分背景或者背景錯分為前景的時候,會導致

2部分的方差變小。

因此,類間方差最 大意味著錯分概率最小。

3.演算法過程:(1

)對於影象

i(x,y)

,將前景與背景的分割閾值設為t。

(2)將屬於前景的畫素點的個數佔整個影象的比例設為

w0,其平均灰度設為u0。

(3)將屬於背景的畫素點的個數佔整個影象的比例設為w1,其平均灰度設為u1。

(4)影象的總平均灰度設為u,類間方差設為s。

假設的大小為m*n,影象中畫素灰度值小於閾值t的畫素個數記為n0,

畫素灰度大於閾值t的畫素個數記為n1。

則它們之間的關係如下。

4.**實現(opencv3):

#include "opencv.hpp"

#include "imgproc.hpp"

#include "highgui.hpp"

#include "iostream"

#include "core.hpp"

using namespace cv;

using namespace std;

int otsu(mat srcimage); //一維otsu演算法

int main()

//一維otsu演算法

int otsu(mat srcimage)

int height = srcimage.rows; //rows為的行數,相當於高度,對應.y

int width = srcimage.cols; //cols為的列數,相當於寬度,對應.x

long number = height*width; //畫素總數

int t = 0; //otsu演算法閾值

double varvalue = 0; //類間方差中間值

double w1 = 0; //前景畫素點所佔比例

double w2 = 0; //背景畫素點所佔比例

double u1 = 0; //前景平均灰度

double u2 = 0; //背景平均灰度

int histogram[256] = ; //灰度直方圖,下標是灰度值,儲存內容是灰度值對應的畫素點總數。

uchar *data = srcimage.data;

for (int i = 0; i < height; i++) }

for (int i = 1; i < 255 ;i++)//從1開始遍歷,尋找最合適的值

u1 = u1 / w1; //背景畫素平均灰度

w1 = w1 / number; //背景部分畫素點所佔比例

for (int k = i + 1; k < 255; k++)

u2 = u2 / w2; //前景畫素平均灰度

w2 = w2 / number; //前景部分畫素所佔比例

//類間方差計算

double varvaluei = w1*w2*(u1 - u2)*(u1 - u2);

if ( varvaluei>varvalue)

}cout << t<

5.執行結果:

二維OTSU演算法快速實現

otsu自適應閾值選取演算法作為一種經典的閾值分割演算法,在影象領域有廣泛的應用。在一維otsu演算法上發展而來的二維otsu演算法因為計算時間複雜度高而制約了其應用。通過消除二維自適應閾值演算法中的冗餘計算,用迭代的方式得到查詢表,從而大大的提高了二維閾值計算的速度。實現的 二維otsu演算法實現...

Niblack演算法和OTSU演算法的實現

1 otsu演算法是設閾值將影象分割成倆組,一組灰度對應目標,另一組灰度對應背景,則這倆組灰度值的類內方差最小,倆組的類間方差最大。相關公式 g w0 u0 u u0 u w1 u1 u u1 u w0 w1 u0 u1 u0 u1 我們將遍歷最小灰度值到最大灰度值t作為影象的閾值,如果目標點的灰度...

演算法解剖系列 Otsu二值化原理及實現

推導大致過程 對一幅大小為m n 的數字影象 令l 表示灰度級數 ni 表示灰度級為 i 的畫素數,則影象中畫素總數mn n1 n2 n 3 nl pi ni mn,p i 為相對直方圖,即灰度級為 i 出現的概率。則 l i 1p i 1 設閾值t k k,1 k以將影象 分為c1 和c2兩 類,...