1. 程式人生 > >OTSU-method 大津演算法

OTSU-method 大津演算法

大津演算法是將灰度圖二值化的常用方法,對具有兩個峰的灰度圖效果很好。
閾值 thth 將影象分為前景畫素和背景畫素。設整幅影象的平均灰度值為μ\mu;前景畫素所佔的比例為ω1\omega_{1},平均灰度值為μ1\mu_{1};背景畫素所佔比例為ω2\omega_{2},平均灰度值為μ2\mu_{2}。則此時的類間方差
σ2=ω1(μ1μ)2+ω2(μ2μ)2\sigma^{2} = \omega_{1}(\mu_1-\mu)^2+ \omega_{2}(\mu_2-\mu)^2
其中
μ=ω1μ1+ω2μ2

\mu=\omega_1\mu_1+\omega_2\mu_2
ω1+ω2=1\omega_1+\omega_2=1
整理得:
σ2=ω1ω2(μ1μ2)2\sigma^{2} = \omega_{1}\omega_{2}(\mu_1-\mu_2)^2
接下來就是要遍歷 thth找到最大的類間方差σ2\sigma^2,那麼此時的thth就是我們要找的二值化閾值。
matlab程式碼如下所示:

% 讀取影象
I = imread('ccc.jpg');
% 初始化灰度直方圖
H = zeros(256);

% 計算灰度直方圖
[l, w] = size(I);
for r = 1:l
    for c = 1:w
        index = I(r, c) + 1;      
        H(index) = H(index) + 1;
    end
end
% 顯示灰度直方圖
figure;
hist = bar(0:255, H, 'histc');
max = 0;
% 閾值
index = 0;

sum = 0;
for j = 1:256
    sum = sum + j * H(j);
end
n_pixels = l * w;
n_current_pixels = 0;
average_gray_value = 0;
% 尋找最大類間方差
for i = 1:255
    gray_value = i * H(i)  + average_gray_value * n_current_pixels ;
    n_current_pixels = n_current_pixels + H(i); 
    average_gray_value  = gray_value / n_current_pixels;
    average_gray_value2 = (sum-gray_value)/(n_pixels - n_current_pixels)
    s = n_current_pixels * (n_pixels - n_current_pixels) / n_pixels^2  * (average_gray_value-average_gray_value2)^2;
    if (s > max)
        max = s;
        index = i;
    end
end
th = index
I2 = zeros(size(I));
I2 (find(I>=th)) = 255;
I2 (find(I<th)) = 0;
figure;
imshow(I2)

測試結果:
輸入影象
在這裡插入圖片描述
輸出影象
在這裡插入圖片描述

OTSU-method視覺化:
在這裡插入圖片描述