zoukankan      html  css  js  c++  java
  • CV基础(2):OSTU算法

    Otsu算法是一种基于像素特征的算法,它采用最大类间阈值分割图像为前景和背景两部分,所以是一种基于全局特征的算法,对目标单一的图像分割效果较好,对多目标图像 此方法往往无能为力

    1、OTSU算法原理

    最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。算法假设图像像素能够根据阈值,被分成背景[background]和目标[objects]两部分。然后,计算使得两类像素类间方差最大(区分度最大)的像素值,该像素值就是分割阈值。

    推导过程:  记 M = 256 单通道灰度分级 Sum = 像素总数

    • 背景像素占比:
    • 前景像素占比:
    • 背景的平均灰度值:
    • 前景的平均灰度值:
    • 灰度图像整体累计值:
    • 前景、背景类间方差:
      将公式3.4.5带入公式6 可得最终简化公式:

    2、基于OpenCV的实现代码

    基于VS2017 + OepnCV4.10

    Mat base = imread(".//test//1.jpg");
    Mat grey;
    cvtColor(base, grey, COLOR_RGB2GRAY);
    	
    Mat seg;
    long timeStart = clock();
    uint32_t thresh = threshold(grey, seg, 0, 255, THRESH_OTSU);
    long timeFinish = clock();
    cout << "Calculating time: " << timeFinish - timeStart << endl;
    
    imshow("Origin", base);
    imshow("Middle", seg);
    imshow("Result", grey);
    cout << "The threshold is: " << thresh << endl;
    waitKey(0);
    

    运行结果:
    test.gif

    3、Reference

    详细及易读懂的大津法原理和实现

  • 相关阅读:
    C# 创建与读写配置文件
    C# 绘图三种方式
    WindowsForms获取服务名称
    Hbase之JAVA API不能远程访问问题解决
    Jenkins之自动构建
    Jenkins配置匿名用户拥有只读权限
    XShell中文乱码问题解决
    mybatis之关联(2)
    mybatis之动态SQL
    mybatis之一对一关联
  • 原文地址:https://www.cnblogs.com/wnwin/p/11205051.html
Copyright © 2011-2022 走看看