vector<double> sub(vector<int> A, vector<double> B) //减法
{vector<double> C;C.resize(3);for (int i = 0; i < A.size(); i++){C[i] = A[i] - B[i];}return C;
}vector<double> multi(vector<double> A, int b)//乘法
{vector<double> C;C.resize(3);for (int i = 0; i < A.size(); i++)   {C[i] = A[i] * b;}return C;
}vector<double> multi(vector<double> A, vector<double> B)//乘法
{vector<double> C;C.resize(3);for (int i = 0; i < A.size(); i++){C[i] = A[i] * B[i];}return C;
}vector<double> divi(vector<double> A, vector<double> B)//处罚
{vector<double> C;C.resize(3);for (int i = 0; i < A.size(); i++){if(B[i]==0){continue;}C[i] = A[i] / B[i];}return C;
}/*
* 实现python的linspace函数功能
*/
std::vector<double> linspace(int start_in, int end_in, int num_in)
{std::vector<double> linspaced;double start = static_cast<double>(start_in);double end = static_cast<double>(end_in);double num = static_cast<double>(num_in);if (num == 0) { return linspaced; }if (num == 1){linspaced.push_back(start);return linspaced;}double delta = (end - start) / (num - 1);for (int i = 0; i < num - 1; ++i){linspaced.push_back(start + delta * i);}linspaced.push_back(end); return linspaced;
}
/*
* vector容器第n个到m个元素求和
*/
double compute_sum(vector<double>& Vec, int start, int end)
{double total = 0;for (int i = start; i < end; i++){total += Vec[i];}  return total;
}/*
* vector容器dot点乘
*/
double compute_dot(vector<double>& Vec1, vector<double>& Vec2, int start, int end)
{double total = 0;double temp = 0;for (int i = start; i < end; i++){temp = Vec1[i]*Vec2[i];total = total + temp;}return total;
}void otsu3layers(Mat &input)
{//Mat img = input.clone();int high = input.rows;int wide = input.cols;Mat hist;const int bins[1] = { 256 };float hranges[2] = { 0,256 };const float* ranges[1] = { hranges };calcHist(&input, 1, 0, Mat(), hist, 1, bins, ranges);//hist256*1,每个灰度级中所含的像素数vector<double>p;//每个像素所占总像素数的比例std::vector <double>lsp;double temp = 0;for (int i = 0; i < hist.rows; i++){for (int j = 0; j < hist.cols; j++){temp = hist.at<float>(i, j) / (high * wide);p.push_back(temp);}}lsp = linspace(1, 256, 256);//.reshape没写double maxvar = 0;int th1 = 0;int th2 = 0;int cnt = 0;double w0 = 0;double w1 = 0;double w2 = 0;double u0 = 0;double u1 = 0;double u2 = 0;double varbetween = 0;vector<double>W;vector<int>U;vector<double>tempp;for (int k1 = 1; k1 < 257; k1++){for (int k2 = k1 + 1; k2 < 257; k2++){w0 = compute_sum(p, 0, k1);//0.00118w1 = compute_sum(p, k1, k2);//0.00076w2 = compute_sum(p, k2, 256);//0.998u0 = compute_dot(lsp, p, 0, k1);//0.00118u1 = compute_dot(lsp, p, k1, k2);//0.00152u2 = compute_dot(lsp, p, k2, 256);//53.78W.push_back(w0);W.push_back(w1);W.push_back(w2);U.push_back((int)u0);U.push_back((int)u1);U.push_back((int)u2);int UT = accumulate(U.begin(), U.end(), 0);//53tempp = multi(W, UT);tempp = sub(U, tempp);tempp = multi(tempp, tempp);tempp = divi(tempp, W);varbetween = compute_sum(tempp, 0, 3);if (varbetween > maxvar){cnt = cnt + 1;maxvar = varbetween;th1 = k1;th2 = k2;}W.clear();U.clear();tempp.clear();/*cout << "阈值为" << th1 << "和" << th2 << endl;*/}}for (int row = 0; row < high; row++){uchar* cur = input.ptr<uchar>(row);for (int col = 0; col < wide; col++){uchar gray = cur[col];/*if (gray < th1){gray = 0;cur[col] = gray;}else if (gray > th1 && gray < th2){gray = 127;cur[col] = gray;}else{gray = 255;cur[col] = gray;}*/if (gray < th2){gray = 255;cur[col] = gray;}else{gray = 0;cur[col] = gray;}}}}

参考自:https://www.cnblogs.com/Linkdom/p/16122676.html#%E5%9F%BA%E4%BA%8Eotsu%E7%9A%84%E5%9B%BE%E5%83%8F%E5%A4%9A%E9%98%88%E5%80%BC%E5%88%86%E5%89%B2%E7%AE%97%E6%B3%95

C++ opencv基于OTSU图像多阈值分割相关推荐

  1. c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...

    " 前言:安利Python来开发OpenCV的原因其实细心的小伙伴早在?[视觉与图像]Python+OpenCV教程入门篇就找到了想要的答案.(点蓝字即可打开) " 今天周五了! ...

  2. 图像的阈值分割(Optimum Thresholding)

    摘    要:本实验主要实现最优阈值.图像分割就是把图像中具有特殊涵义的不同区域分开来,这些区域是互不相交的,每个区域都满足特定区域的一致性.图像分割是图像处理中的重要问题,也是计算机视觉研究中的一个 ...

  3. 红外目标图像中阈值分割方法的比较与研究

    红外目标图像中阈值分割方法的比较与研究   摘要:本文主要以红外图像目标检测技术为背景,在图像阈值分割中以最大熵准则及遗传算法为基础,研究了一维最大熵值法(KSW法)及基于遗传算法的KSW熵法单阈值. ...

  4. Python对DICOM图像进行阈值分割

    Python对Dicom图像进行处理,离不开pydicom,opencv-python,matplotlib,numpy四个代码库,安装完成这四个代码库后, 可以读取Dicom图像,并对图像进行处理, ...

  5. 图像二值化方法及适用场景分析(OTSU Trangle 自适应阈值分割)

    图像二值化 应用场景 二值图像定义 阈值获取的方法 手动阈值法 自动阈值法 灰度均值法 基于直方图均值法 OTSU Triangle 自适应均值阈值分割方法 总结 参考文献 应用场景 二值图像处理与分 ...

  6. 基于OpenCV和C++实现最大阈值分割算法

    代码如下:: /******************************************************************************************** ...

  7. matlab中图像的阈值分割,基于MATLAB的图像阈值分割技术汇总

    数字图像处理课程论文 基于MATLAB的图像阈值分割技术 摘要:本文主要针对图像阈值分割做一个基于MATLAB的分析.通过双峰法,迭 代法以及OUTS法三种算法来实现图像阈值分割,并且就这三种算法做了 ...

  8. python+OpenCV图像处理(五)图像的阈值分割

    图像的阈值处理 一幅图像包括目标物体.背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群.这是研究灰度变换 ...

  9. opencv学习笔记10:阈值分割

    阈值分割 像素图 原始图像像素图 见下面 红色线:标注一条阈值线 二进制阈值化 首先设定一条阀值线 如127 大于127的像素点灰度值设为最大(如unit8的格式为255) 小于127的像素点灰度值设 ...

最新文章

  1. Spring Boot中实现跨域的五种方式
  2. 使用程序创建数据库表
  3. CPU 的 ring0、ring1、ring2、ring3
  4. 姐妹花考上川大本硕博连读,网红兄弟一起上清华
  5. 【CCF】201712-2游戏
  6. 如何在Xubuntu 15.04中安装最新版Eclipse luna
  7. iwrite提交不了作业_痛点!为什么开发了那么多软件,还是解决不了教学问题!...
  8. 单页面路由工程使用微信分享及二次分享解决方案
  9. AD(十九)class、设计参数、规则的创建
  10. sharepoint FAST serach 设置
  11. WINVER 和 _WIN32_WINNT
  12. 测试设计点-pc端和移动端微信加入群聊
  13. Cookie--防劫持的处理
  14. LATEXT导入.sty
  15. 如何在Windows资源管理器中自定义文件夹背景和图标
  16. 1598_AURIX_TC275_GPIO功能以及部分寄存器梳理1
  17. windows tcp端口映射或端口转发
  18. 【身份证识别】基于形态学实现ID号码识别系统matlab源码含GUI
  19. MFC开发xml编辑器小结
  20. ppt怎么不显示动画效果的标记,看上去好乱啊

热门文章

  1. 项目经理如何汇报工作
  2. html---学习之路(form表单的基本属性)
  3. POI 实现Excel导入数据库
  4. Cadence——面向资源的编程
  5. Activity渲染完成第一帧时机
  6. javescript 字符串生成 hash 值
  7. MySQL 截取字符串函数
  8. 工作之余想线上学习软件测试靠谱么?
  9. 区块链商品溯源系统左侧导航栏+右侧加载页面ajax html
  10. 《恋爱公寓》用户隐私政策