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

2021-06-17 22:31:55 字數 1655 閱讀 3290

1、otsu演算法是設閾值將影象分割成倆組,一組灰度對應目標,另一組灰度對應背景,則這倆組灰度值的類內方差最小,倆組的類間方差最大。相關公式:

g = w0 *(u0 - u)*(u0 - u) + w1*(u1 - u)*(u1 - u) = w0 * w1 *(u0 - u1)*(u0 - u1)

我們將遍歷最小灰度值到最大灰度值t作為影象的閾值,如果目標點的灰度值小於閾值則歸為背景,大於閾值則歸為前景。w0為使用前景t作為閾值是時畫素點數比例,u1為使用t作為閾值是前景時平均灰度;w1為使用t作為閾值時背景畫素點數比例,u1為使用t作為閾值是背景的平均灰度。而u則可由下式得到:

u = w0 * u0 + w1 * u1

void otsu(const iplimage *srcimg,iplimage *dstimg)

} //統計每個灰度值的畫素點數

double fmax = 0;

int bestth = 0;

int *n = new int[m];

int *px = new int[m];

memset(n , 0, m * sizeof(int));

memset(px, 0, m * sizeof(int));

n[0] = color[0];

px[0] = 0;

for(int i = 1; i < m; i++)

//計算總的畫素點數和總灰度值

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

//fmax始終為最大類間方差,bestth為對應的最大類間方差的灰度值即為最佳閾值

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

delete color;

delete n;

delete px;

}

2、nilblack二值化演算法是針對全域性閾值發在影象和背景灰度相差明顯時容易忽略細節的問題進行優化,是一種常用的比較有效的區域性閾值演算法。這種演算法的基本思想是對預想中的每乙個點,在它的r*r領域內,計算領域裡的畫素點的均值和方差,然後下式計算閾值進行二值化:t(x,y) = m(x,y) + k* s(x,y)其中對於畫素點座標(x,y),t(x,y) 為該點閾值,m(x,y)為該點的r*r領域內畫素點的畫素均值,s(x,y)為該店r*r領域內畫素標準方差,k為修正係數(通常取-0.1)。

void niblack(const iplimage *srcimg, iplimage *binimg, double k)

} //計算在該小領域內灰度值總和

mean = mean/total; //該領域的平均灰度

for(int y = begin_y; y < end_y; y++)

} //求出該領域內總的方差和

std /=total;

std = sqrt(std); //求出標準差

double threshold = mean + k * std; //求出所得到的的閾值

int temp = 255;

if(srcptr[j] > threshold)

dstptr[j] = temp;

else

dstptr[j] = 0;

}} }

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

演算法實現 不呼叫函式 include include using namespace std using namespace cv 實現灰度直方圖的繪製 void drawpicture mat inpicture,mat outpicture ma hist const int bins 256...

C 實現otsu演算法

類間方差最大化閾值分割演算法 otsu 可以自動計算影象二值化時的閾值,otsu的中心思想是閾值t應使目標與背景兩類的類間方差最大。具體原理如下 otsu是按影象的灰度特性,將影象分成背景和目標兩部分。背景和目標之間的類間方差越大,說明構成影象的兩部分的差別越大,當部分目標錯分為背景或部分背景錯分為...

大津法 OTSU演算法

opencv的二值化操作中,有一種 大津閾值處理 的方法,使用函式cvthreshold image,image2,0,255,cv thresh otsu 實現,該函式就會使用大律法otsu得到的全域性自適應閾值來進行二值化,而引數中的threshold不再起作用。otsu演算法 otsu演算法也...