C++ 图像处理(十七) 基于一维的means二值化

本文介绍了一种基于一维Means的图像二值化算法,通过迭代计算前景与背景像素的平均值来确定最佳阈值,实现图像的黑白转换。算法首先设定初始阈值,然后根据像素灰度值将其分为两组,计算每组平均灰度值并更新阈值,直至阈值稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于一维的means二值化

原理
//近视一维的means的二值化

  1.  一个初始化阈值T = 127,可以自己设置或者根据随机方法生成。
    
  2.  根据阈值图将每个像素数据P(n,m)分别分为对象像素数据集G1(保存像素灰度值)与背景像素数据集G2。(n为行,m为列)
    
  3.  G1的平均值是m1, G2的平均值是m2
    
  4.  一个新的阈值T’ = (m1 + m2)/2
    
  5.  回到第二步,用新的阈值继续分像素数据为对象与背景像素数据,继续2~4步,直到新的阈值与上一个阈值相同时退出循环
    

代码:

一维的means函数:

void* One_dimensional_means(QImage &image,QImage &opt)
{
    int height = image.height();
    int width = image.width();
    int i=0,j=0;
    int gray = 0;
    double means1 = 0;
    double means2 = 0;
    QVector<int> sub1;
    QVector<int> sub2;
    //QVector<int>().swap(sub1);


    //1.      一个初始化阈值T,可以自己设置或者根据随机方法生成。
    int init_threshod = 127;
    int final_threshod = 0;

    //2.      根据阈值图每个像素数据P(n,m)分为对象像素数据G1与背景像素数据G2。(n为行,m为列)
    while(init_threshod != final_threshod)
    {
        final_threshod = init_threshod;
        for(i = 0; i<height; i++)
        {
            for(j = 0; j<width; j++)
            {
                gray = qGray(image.pixel(j,i));
                if(gray > init_threshod)
                {
                    sub1.push_back(gray);
                }else {
                    sub2.push_back(gray);
                }

            }
        }
        //3.      G1的平均值是m1, G2的平均值是m2
        means1 = getMeans(sub1);
        means2 = getMeans(sub2);

        //一个新的阈值T’ = (m1 + m2)/2
        init_threshod = (means1 + means2) / 2;

        QVector<int>().swap(sub1);
        QVector<int>().swap(sub2);
    }

    Threshold(image,opt,double(final_threshod));

    return 0;
}

背景数据集与前景数据的平均值 getMeans函数:

/QVector 元素的均值
double getMeans(const QVector<int> &vect)
{
    double sum = 0;
    for(int i=0; i<vect.size();i++)
    {
        sum += vect[i];
    }

    return sum/vect.size();
}

二值化函数 Threshold函数 :

//二值化 (不用创建大小)
void Threshold(const QImage &inputImage,QImage &outputImage,double bThres)
{
    BYTE bt;
    int width = inputImage.width();
    int height = inputImage.height();

    QImage* output = new QImage(width,height,QImage::Format_ARGB32);

    Init_Image(*output,0);

    for(int i = 0; i<height; i++)
    {
        for(int j = 0; j<width; j++)
        {

            bt = qGray(inputImage.pixel(j,i));

            if(bt>bThres)
            {
                bt = 255;
            }else {
                bt = 0;
            }
            output->setPixel(j,i,qRgb(bt, bt, bt));
        }
    }

    outputImage = *output;
}

效果图:
原图:
在这里插入图片描述
二值化后的图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值