m0_63579880 2023-05-11 15:29 采纳率: 0%
浏览 9

基本的全局阈值处理用C++代码怎么实现?!不使用函数的情况下

•当物体和背景像素的灰度分布十分明显时,可以用适用于整个图像的单个 (全局)阈值处理,其算法如下: 为全局阈值T选择一个初始估计值 用单个阈值T分割图像。将产生两组像素:G,和G2,其中G1由灰度值大 于T的所有像素组成,Gz由所有小于等于T的像素组成 对Gi和Gz的像素分别计算平均灰度值(均值)mi和m2 计算一个新的阈值:T = (mi + mz) 重复步骤(2)到步骤(4),直到连续迭代中的两个T值小于预定义的 AT为止。

  • 写回答

1条回答 默认 最新

  • Helloorld_11 2023-05-11 15:47
    关注

    如果您觉得有用,不妨打赏和采纳该评论,希望能对您有所帮助
    使用cv::thresold的写法:

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
        // 读取图像
        Mat img = imread("image.png", IMREAD_GRAYSCALE);
    
        // 选择一个初始阈值T
        double T = 127;
    
        // 定义一个预设的AT
        double AT = 1;
    
        // 定义一个循环标志
        bool flag = true;
    
        while (flag)
        {
            // 用单个阈值T分割图像
            Mat thresh;
            threshold(img, thresh, T, 255, THRESH_BINARY);
    
            // 计算G1和G2的像素均值m1和m2
            double m1 = mean(img, thresh)[0];
            double m2 = mean(img, 255 - thresh)[0];
    
            // 计算一个新的阈值T_new
            double T_new = (m1 + m2) / 2;
    
            // 判断T_new和T是否小于AT
            if (abs(T_new - T) < AT)
            {
                // 结束循环
                flag = false;
            }
            else
            {
                // 更新T为T_new
                T = T_new;
            }
        }
    
        // 显示分割后的图像
        imshow("Thresholded Image", thresh);
        waitKey(0);
        destroyAllWindows();
    }
    

    不使用cv::thresold函数

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main()
    {
        // 读取图像
        Mat img = imread("image.png", IMREAD_GRAYSCALE);
    
        // 选择一个初始阈值T
        double T = 127;
    
        // 定义一个预设的AT
        double AT = 1;
    
        // 定义一个循环标志
        bool flag = true;
    
        while (flag)
        {
            // 定义两个像素组G1和G2
            vector<uchar> G1, G2;
    
            // 遍历图像中的每个像素
            for (int i = 0; i < img.rows; i++)
            {
                for (int j = 0; j < img.cols; j++)
                {
                    // 获取当前像素的灰度值
                    uchar pixel = img.at<uchar>(i, j);
    
                    // 根据阈值T将像素分到G1或G2中
                    if (pixel > T)
                    {
                        G1.push_back(pixel);
                    }
                    else
                    {
                        G2.push_back(pixel);
                    }
                }
            }
    
            // 计算G1和G2的像素均值m1和m2
            double m1 = mean(G1)[0];
            double m2 = mean(G2)[0];
    
            // 计算一个新的阈值T_new
            double T_new = (m1 + m2) / 2;
    
            // 判断T_new和T是否小于AT
            if (abs(T_new - T) < AT)
            {
                // 结束循环
                flag = false;
            }
            else
            {
                // 更新T为T_new
                T = T_new;
            }
        }
    
        // 创建一个输出图像
        Mat dst = Mat::zeros(img.size(), img.type());
    
        // 遍历图像中的每个像素
        for (int i = 0; i < img.rows; i++)
        {
            for (int j = 0; j < img.cols; j++)
            {
                // 获取当前像素的灰度值
                uchar pixel = img.at<uchar>(i, j);
    
                // 根据阈值T将像素分为黑色或白色
                if (pixel > T)
                {
                    dst.at<uchar>(i, j) = 255;
                }
                else
                {
                    dst.at<uchar>(i, j) = 0;
                }
            }
        }
    
        // 显示分割后的图像
        imshow("Thresholded Image", dst);
        waitKey(0);
        destroyAllWindows();
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop