Visual C++ 2019中MFC图像处理编程(四) 图像分割

Visual C++ 2019 中 MFC 图像处理编程(四)

使用自动阈值迭代法及 Otsu 法对图像进行分割。

图像分割指将图像分成各具特性的区域并提取出感兴趣目标的技术和过程,它的目的在于把图像空间分成一些具有意义的区域。
阈值分割法是图像分割中的经典方法,它利用图像中要提取的目标物体和背景在灰度上的差异,通过设置阈值把像素点按灰度级分为若干类,从而实现图像分割。一般通过判断图像中每一个像素点的特征属性是否满足阈值要求,来确定图像中该像素点是属于目标区域还是背景区域,从而将一幅灰度图像转换成二值图像。

  • 自动阈值迭代法
    迭代法是基于逼近的思想,其步骤如下:
    ① 估计一个阈值 T,如均值。
    ② 根据阈值 T 将图像分割为前景 R1 和背景 R2,分别求出两者的平均灰度值 u1 和 u2;
    ③ 求出新阈值 T=(u1+u2)/2;
    ④ 若两个平均灰度值 u1 和 u2 不再变化(或 T 不再变化),则T即为阈值;否则转(2)迭代计算。
  • Otsu 法(大津法)
    Otsu 法又称为最大方差阈值分割法,是一种使用最大类间方差的自动确定阈值的方法。该方法是在判别与最小二乘原理的基础上推导出来的,效果较好。
    设图像的像素总数为 N,灰度范围为[0,L-1],灰度值 i 的像素数为 ni,则 i的概率为:

在这里插入图片描述

把图像中的像素按灰度值用阈值 T 分成 C0 和 C1 两类,C0 对应于灰度值在[0,T-1]之间的像素,C1对应于灰度值在[T,L-1]之间的像素,则 C0和 C1的概率分别为:
在这里插入图片描述

C0和 C1的均值分别为:
在这里插入图片描述

整个图像的灰度均值为:

在这里插入图片描述

定义类间方差为:

在这里插入图片描述

令 T 在[0,L-1]范围内,以步长 1 依次递增取值,当σ2最大时对应的 T 即为最佳阈值。

  • 自动阈值迭代法关键代码的实现:
  1. 对图像求取灰度平均值作为初始阈值 T0:
for (int j = 0; j < biHeight; j++){
for (int i = 0; i < biWidth; i++){
temp = pData[(j* biWidth) + i];
sum += temp;
}}
T0 = sum / (biHeight * biWidth);
Thtemp = T0;
}}
  1. 分别求出前景和后景的平均灰度值 ua 和 ub:
for (y = 0; y < m_nHeight; y++){
for (x = 0; x < m_nWidth; x++){
temp = m_pImage[(x + y * m_nWidth) * 3 + y * num];
if (temp < Thbest){
suma += temp;
sumsa++;
}
else{
sumb += temp;
sumsb++;
}}}
float ua = suma / sumsa;
float ub = sumb / sumsb;
  1. 求出新阈值 T:
Thtemp = (int)(ua + ub) / 2;
  1. 最佳阈值得到后,对图像进行阈值处理,小于等于 Thtemp 的为 0,大于Thtemp 的为 255:
for (int m = 0; m < biHeight; m++){
for (int n = 0; n < biWidth; n++){
temp = pData[m * biWidth + n];
if (temp > Thtemp)
literationpData[m * biWidth + n] = 255;
else
literationpData[m * biWidth + n] = 0;
}}
  • Otsu 法关键代码的实现:

算法步骤:

  1. 设置初值 w,u。
  2. 令阈值 T 从 0-255 开始,根据阈值 T 将图像分割为前景 R1 和背景 R2,分别求出两者的平均灰度值 u1 和 u2,平均概率值 w1 和 w2。
  3. 通过计算得到的平均灰度值和平均概率值计算类间方差。
  4. 使类间方差最大的 T 值即为所求 T 值。
  5. 阈值确定后,小于等于 T 的为 0,大于 T 的为 255。

具体代码实现如下所示:

  1. 设置初值。其中 u1、u2 是前景和背景的平均灰度值,w1、w2 是前景和背景的平均概率值;sigmab2 为类间方差值,sigmab2best 为最大的类间方差值。
float u1 = 0, u2 = 0,w1=0, w2=0, sigmab2=0, sigmab2best = 0;
int temp 
  1. 令阈值 T 从 0-255 开始,根据阈值 T 将图像分割为前景 R1 和背景 R2,分别求出两者的平均灰度值 u1 和 u2,平均概率值 w1 和 w2。
for (int T = 1; T < 256; T++){
for (int y = 0; y < biHeight; y++){
for (int x = 0; x < biWidth; x++){
temp = pData[y * biWidth + x];
if (temp < T){
suma += temp;
sumsa++;
}else{
sumb += temp;
sumsb++;
}}}
u1 = suma / sumsa;
u2 = sumb / sumsb;
w1 = sumsa / (biHeight * biWidth);
w2 = sumsb / (biHeight * biWidth);
}
  1. 计算前景和背景的类间方差。
sigmab2 = w1 * w2 * (u1 - u2) * (u1 - u2);
}
  1. 使类间方差最大的 T 值即为所求 T 值。
if (sigmab2 > sigmab2best)
{
sigmab2best = sigmab2;
Thbest = T;
}
  1. 最佳阈值得到后,对图像进行阈值处理,小于等于 T 的为 0,大于 T 的
    为 255:
for (int m = 0; m < biHeight; m++){
for (int n = 0; n < biWidth; n++){
temp = pData[m * biWidth + n];
if (temp > Thbest)
otsupData[m * biWidth + n] = 255;
else
otsupData[m * biWidth + n] = 0;
}}
  • 运行结果如下所示:
    在这里插入图片描述
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值