在opencv工程里面使用otsu分割灰度图像类似于matlab里的graythresh,

opencv里面提供了otsu threshold的源代码“icvGetThreshVal_Otsu”,我们可以根据源代码进行自动阈值处理

icvGetThreshVal_Otsu的源代码如下:

//opencv Source code:
static double icvGetThreshVal_Otsu( const CvHistogram* hist )
{  double max_val = 0;  CV_FUNCNAME( "icvGetThreshVal_Otsu" );  __BEGIN__;  int i, count;  const float* h;  double sum = 0, mu = 0;  bool uniform = false;  double low = 0, high = 0, delta = 0;  float* nu_thresh = 0;  double mu1 = 0, q1 = 0;  double max_sigma = 0;  if( !CV_IS_HIST(hist) || CV_IS_SPARSE_HIST(hist) || hist->mat.dims != 1 )  CV_ERROR( CV_StsBadArg,  "The histogram in Otsu method must be a valid dense 1D histogram" );  count = hist->mat.dim[0].size;  h = (float*)cvPtr1D( hist->bins, 0 );  if( !CV_HIST_HAS_RANGES(hist) || CV_IS_UNIFORM_HIST(hist) )  {  if( CV_HIST_HAS_RANGES(hist) )  {  low = hist->thresh[0][0];  high = hist->thresh[0][1];  }  else  {  low = 0;  high = count;  }  delta = (high-low)/count;  low += delta*0.5;  uniform = true;  }  else  nu_thresh = hist->thresh2[0];  for( i = 0; i < count; i++ )  {  sum += h;  if( uniform )  mu += (i*delta + low)*h;  else  mu += (nu_thresh[i*2] + nu_thresh[i*2+1])*0.5*h;  }  sum = fabs(sum) > FLT_EPSILON ? 1./sum : 0;  mu *= sum;  mu1 = 0;  q1 = 0;  for( i = 0; i < count; i++ )  {  double p_i, q2, mu2, val_i, sigma;  p_i = h*sum;  mu1 *= q1;  q1 += p_i;  q2 = 1. - q1;  if( MIN(q1,q2) < FLT_EPSILON || MAX(q1,q2) > 1. - FLT_EPSILON )  continue;  if( uniform )  val_i = i*delta + low;  else  val_i = (nu_thresh[i*2] + nu_thresh[i*2+1])*0.5;  mu1 = (mu1 + val_i*p_i)/q1;  mu2 = (mu - q1*mu1)/q2;  sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);  if( sigma > max_sigma )  {  max_sigma = sigma;  max_val = val_i;  }  }  __END__;  return max_val;
}  

对源代码进行改写,得到我们想要的代码:

double getThreshVal_Otsu_8u( const cv::Mat& _src )
{cv::Size size = _src.size();if ( _src.isContinuous() ){size.width *= size.height;size.height = 1;}const int N = 256;int i, j, h[N] = {0};for ( i = 0; i < size.height; i++ ){const uchar* src = _src.data + _src.step*i;for ( j = 0; j <= size.width - 4; j += 4 ){int v0 = src[j], v1 = src[j+1];h[v0]++; h[v1]++;v0 = src[j+2]; v1 = src[j+3];h[v0]++; h[v1]++;}for ( ; j < size.width; j++ )h[src[j]]++;}double mu = 0, scale = 1./(size.width*size.height);for ( i = 0; i < N; i++ )mu += i*h[i];mu *= scale;double mu1 = 0, q1 = 0;double max_sigma = 0, max_val = 0;for ( i = 0; i < N; i++ ){double p_i, q2, mu2, sigma;p_i = h[i]*scale;mu1 *= q1;q1 += p_i;q2 = 1. - q1;if ( std::min(q1,q2) < FLT_EPSILON || std::max(q1,q2) > 1. - FLT_EPSILON )continue;mu1 = (mu1 + i*p_i)/q1;mu2 = (mu - q1*mu1)/q2;sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);if ( sigma > max_sigma ){max_sigma = sigma;max_val = i;}}return max_val;
}

直接进行调用上述函数,即可:

m_threshold = getThreshVal_Otsu_8u(matMedian);

在进行二值化:

threshold(matMedian,matBinary,m_threshold,255,0);   // 二值化

详细请参考OpenCV  Miscellaneous Image Transformations

OpenCV中threshold自动阈值,类似matlab中的graythresh相关推荐

  1. matlab中的timer模块,[转载]Matlab中Timer的使用

    Matlab中Timer的使用 鉴于Matlab中缺乏多线程机制,使用Timer无疑是一个很重要的工具,Matlab中Timer是一个Java对象. (1)Timer 的定义 t=timer(); 设 ...

  2. 在MATLAB中使用数学符号,在matlab中怎么输入特殊符号 function在MATLAB中怎么用

    导航:网站首页 > 在matlab中怎么输入特殊符号 function在MATLAB中怎么用 在matlab中怎么输入特殊符号 function在MATLAB中怎么用 相关问题: 匿名网友: 一 ...

  3. matlab中m文件是什么,MATLAB中M文件的使用

    运行方法: 使用matlab的时候,可以在"Command Window"内直接书写matlab代码,也可以将代码保存到M文件中,然后运行该文件.使用matlab主界面菜单&quo ...

  4. matlab 如何axis,在matlab中axis是什么意思,matlab中axis的用法

    在matlab中axis是什么意思轴在matlab中是什么意思,matlab中的Axis是指在绘图中通常使用axis函数来设置坐标值的范围,在matlab的命令窗口中输入doc轴或help轴即可获得该 ...

  5. Vivado Turtorial 01 —— 使用vivado中debug功能(类似ISE中ChipScope)

    这是转载大佬的,也可以移植到其他开发板上. Vivado Turtorial 01 -- 使用vivado中debug功能(类似ISE中ChipScope) 1.基于BASYS3板子,有如下代码: m ...

  6. fun在matlab里面啥意思_matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢。谢谢~~...

    导航:网站首页 > matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢.谢谢~~ matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢. ...

  7. 导入matlab某两列数据,将文本文件中的数据导入到matlab中一例(wwh)

    将文本文件(.txt)中的数据导入到matlab中一例 山东水利职业学院王为洪 247128324@http://www.doczj.com/doc/5d97a7dfad51f01dc281f1fd. ...

  8. Python创建类似Matlab中的cell数组

    转载自:https://blog.csdn.net/raby_gyl/article/details/78016690,本文只做个人记录学习使用,版权归原作者所有. npose = 5 nsmile ...

  9. matlab中psnr多了50,matlab中中图像PSNR和SSIM的计算

    网上找了很多关于PSNR和SSIM的计算,很多结果算出来都不一样,公式都是普遍的,如下: 现在总结下造成结果差异的原因. PSNR的差异:1.灰度图像:灰度图像比较好计算只有一个值. 2.彩色图像:a ...

最新文章

  1. nacos 负载策略_Spring Cloud Alibaba:Nacos 作为注册中心和配置中心使用
  2. [转] L1 L2范数
  3. Redis 作为缓存服务器的配置
  4. Android中ImageView常用属性含义
  5. jenkins角色权限管理
  6. 第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍
  7. Android 网络异常
  8. SpringCloud Ribbon负载均衡介绍及使用
  9. Android ADB 用法
  10. UVA11021 Tribles
  11. python报告,python测试结果报告
  12. 【游戏开发实战】下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)
  13. 数学建模暑期集训28:元胞自动机
  14. 虚拟打印机 android版,虚拟打印机(SmartPrinter)
  15. 前传智播客郭永锋最新工作室javaweb2018年4月班视频教程
  16. Authing 实力上榜安全牛《中国网络安全行业全景图》
  17. 数据库备份:Xtrabackup实现完全备份及增量备份
  18. 浅谈安卓apk安装过程中的设计模式
  19. 哈工大软件构造第一章
  20. 视频压缩技术及安卓中用法

热门文章

  1. flutter Dart Mixin后关于调用super的理解
  2. Android引入Ijkplayer
  3. webrequest 访问https url代
  4. 微信小程序——剪贴板 的使用
  5. 一曲京声人去远——纪念刘大中校友100周年诞辰
  6. 搭建一套基于 Groovy 规则引擎的业务风控平台
  7. Hyperledger Fabric的网络拓扑图与交易流程
  8. Jetpack Compose 初体验(上),retrofit原理面试
  9. python3.7 openpyxl函数 拆分 excel 单元格
  10. Linux 内核编程风格