1. 程式人生 > 實用技巧 >2. 二值化

2. 二值化

一、 二值化

二值化就是讓影象的畫素點矩陣中的每個畫素點的灰度值為0(黑色)或者255(白色),也就是讓整個影象呈現只有黑和白的效果。在灰度化的影象中灰度值的範圍為0~255,在二值化後的影象中的灰度值範圍是0或者255。

黑色:

二值化後的R = 0

二值化後的G = 0

二值化後的B = 0

白色:

二值化後的R = 255

二值化後的G = 255

二值化後的B = 255

那麼一個畫素點在灰度化之後的灰度值怎麼轉化為0或者255呢?比如灰度值為100,那麼在二值化後到底是0還是255?這就涉及到取一個閥值的問題。

三、閾值求取演算法

1. 傻瓜法

2. 大律二值演算法

將影象理解成255個圖層,每一層分佈了不同的畫素,這些畫素垂直疊加合成了一張完整的灰度圖。就是找到一個合適的灰度值,大於這個值的我們將它稱之為背景(灰度值越大畫素越黑),小於這個值的我們

將它稱之為前景(灰度值越小畫素越白)。

h:影象的寬度

w:影象的高度(h*w 得到影象的畫素數量)

t :灰度閾值(我們要求的值,大於這個值的畫素我們將它的灰度設定為255,小於的設定為0)

n0:小於閾值的畫素,前景

n1:大於等於閾值的畫素,背景

n0 + n1 == h * w

w0:前景畫素數量佔總畫素數量的比例

w0 = n0 / (h * w)

w1:背景畫素數量佔總畫素數量的比例

w1 = n1 / (h * w)

w0 + w1 == 1

u0:前景平均灰度

u0 = n0灰度累加和 / n0

u1:背景平均灰度

u1 = n1灰度累加和 / n1

u:平均灰度

u = (n0灰度累加和 + n1灰度累加和) / (h * w) 根據上面的關係

u = w0 * u0 + w1 * u1

g:類間方差(那個灰度的g最大,哪個灰度就是需要的閾值t)

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

根據上面的關係,可以推出:(這個一步一步推導就可以得到)

g = w0 * w1 * (u0 - u1) ^ 2

然後,遍歷每一個灰度值,找到這個灰度值對應的 g

找到最大的 g 對應的 t;

演算法實現

Mat Binary_OSTU(Mat img)
{
    // get height and width
    int width = img.cols;
    int height = img.rows;
    Mat 
out = Mat::zeros(height, width, CV_8UC1); double p0 = 0; double u0 = 0; double p1 = 0; double u1 = 0; double n0 = 0; double n1 = 0; int val; double max_sb = 0, sb = 0; int threshold = 0; for (int k = 0; k < 255; k++) { p0 = 0; u0 = 0; p1 = 0; u1 = 0; n0 = 0; n1 = 0; //分為兩類 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { val = (int)(img.at<uchar>(i, j)); if (val < k) { n0++; u0 += val; } else { n1++; u1 += val; } } } //求出概率,均值 u0 = u0 / n0; //第一類均值 u1 = u1 / n1; p0 = n0 / (width* height); p1 = n1 / (width* height); sb = p0 * p1*pow((u0 - u1), 2); if (sb > max_sb) { max_sb = sb; threshold = k; } } cout << "threshold: " << threshold << endl; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if ((int)img.at<uchar>(i, j) > threshold) out.at<uchar>(i, j) = 255; else out.at<uchar>(i, j) = 0; } } return out; }

參考文獻:

Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66

https://www.cnblogs.com/funfei/p/6943665.html

https://zhuanlan.zhihu.com/p/95034826