本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。
一、算法原理
1、原理概述
假设原始图像中像素总数为
K
K
K,对应灰度级为
i
i
i的像素点数量为
k
i
k_i
ki,灰度级数量为
L
L
L,
i
i
i的取值范围为
[
0
,
L
−
1
]
[0,L-1]
[0,L−1],由此可得灰度级为
i
i
i的像素点出现的概率为:
P
i
=
k
i
/
K
,
i
=
0
,
1
,
2
,
…
,
L
−
1
(1)
P_i=k_i/K, i=0,1,2,…,L-1 \tag{1}
Pi=ki/K,i=0,1,2,…,L−1(1)
通过最优阈值
t
t
t将像素点分割成前、后景,其中灰度值为
[
0
,
t
]
[0,t]
[0,t]的部分被分割成前景
Q
0
Q_0
Q0,灰度值为
(
t
,
L
−
1
]
(t,L-1]
(t,L−1]的像素点被分割成后景
Q
1
Q_1
Q1,同时,前景类概率
ω
0
ω_0
ω0与后景类概率
ω
1
ω_1
ω1分别为:
ω
0
(
t
)
=
Σ
i
=
0
t
P
i
(2)
ω_0(t)=Σ_{i =0}^tP_i \tag{2}
ω0(t)=Σi=0tPi(2)
ω
1
(
t
)
=
1
−
ω
0
(
t
)
(3)
ω_1(t)=1-ω_0(t) \tag{3}
ω1(t)=1−ω0(t)(3)
图像平均灰度级
μ
t
μ_t
μt、前景平均灰度值
μ
0
μ_0
μ0、后景平均灰度值
μ
1
μ_1
μ1分别为:
μ
t
=
Σ
i
=
0
L
−
1
i
P
i
(4)
μ_t =Σ_{i =0}^{L -1}iP_i \tag{4}
μt=Σi=0L−1iPi(4)
μ
0
=
Σ
i
=
0
t
i
P
i
/
ω
0
(5)
μ_0 =Σ_{i =0}^tiP_i /ω_0\tag{5}
μ0=Σi=0tiPi/ω0(5)
μ
t
=
Σ
i
=
t
+
1
L
−
1
i
P
i
/
ω
1
(6)
μ_t =Σ_{i =t +1}^{L -1}iP_i /ω_1\tag{6}
μt=Σi=t+1L−1iPi/ω1(6)
由此可得
Q
0
Q_0
Q0与
Q
1
Q_1
Q1间的类间方差
σ
2
σ^2
σ2为:
σ
2
=
ω
0
ω
1
(
μ
0
−
μ
1
)
2
(7)
σ^2 =ω_0ω_1( μ_0 -μ_1)^2\tag{7}
σ2=ω0ω1(μ0−μ1)2(7)
求得使类间方差最大的像素值
t
t
t即为最优阈值,据此便可对原始图像进行二值分割处理
2、参考文献
[1] 黄艳国,钟勇,饶泽浩. 基于优化最大类间方差法阈值分割与滑动窗口法的车道偏离预警 [J]. 汽车技术, 2023, (06): 9-16.
二、代码实现
clc;
clear;
%% -------------------------------读取图像---------------------------------
img = imread("Y.png");
figure;
imshow(img);
title("原始图像");
hold on;
%% -----------------------------将图像灰度化-------------------------------
grayImg = rgb2gray(img);
figure;
imshow(grayImg);
title("灰度图像");
hold on;
%% -----------------------------OTSU二值化---------------------------------
threshold = OtsuProcess(grayImg);
grayImg(grayImg<=threshold) = 0;
figure;
imshow(grayImg);
title("二值化");
hold off
function[optimal_threshold] = OtsuProcess(img)
[row, col] = size(img);
K = row * col; % 像素总数为K
t = -1;
for i=0:255 % 对应灰度级i,灰度级数量L=255
Q0 = sum(sum(img<i)); % 前景Q0
Q1 = K - Q0; % 后景Q1
w0 = Q0 / K; % 前景类概率w0
w1 = 1 - w0; % 后景类概率w1
u0 = sum(img(img<i)) / Q0; % 前景平均灰度值μ0
u1 = sum(img(img>=i)) / Q1; % 后景平均灰度值μ1
g = w0* w1* (u0 - u1)^ 2; % Q0与Q1间的类间方差σ2
if g > t % 求得使类间方差最大的像素值t即最优阈值
t = g;
optimal_threshold = i;
end
end
end