OpenCV中threshold自动阈值,类似matlab中的graythresh
在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相关推荐
- matlab中的timer模块,[转载]Matlab中Timer的使用
Matlab中Timer的使用 鉴于Matlab中缺乏多线程机制,使用Timer无疑是一个很重要的工具,Matlab中Timer是一个Java对象. (1)Timer 的定义 t=timer(); 设 ...
- 在MATLAB中使用数学符号,在matlab中怎么输入特殊符号 function在MATLAB中怎么用
导航:网站首页 > 在matlab中怎么输入特殊符号 function在MATLAB中怎么用 在matlab中怎么输入特殊符号 function在MATLAB中怎么用 相关问题: 匿名网友: 一 ...
- matlab中m文件是什么,MATLAB中M文件的使用
运行方法: 使用matlab的时候,可以在"Command Window"内直接书写matlab代码,也可以将代码保存到M文件中,然后运行该文件.使用matlab主界面菜单&quo ...
- matlab 如何axis,在matlab中axis是什么意思,matlab中axis的用法
在matlab中axis是什么意思轴在matlab中是什么意思,matlab中的Axis是指在绘图中通常使用axis函数来设置坐标值的范围,在matlab的命令窗口中输入doc轴或help轴即可获得该 ...
- Vivado Turtorial 01 —— 使用vivado中debug功能(类似ISE中ChipScope)
这是转载大佬的,也可以移植到其他开发板上. Vivado Turtorial 01 -- 使用vivado中debug功能(类似ISE中ChipScope) 1.基于BASYS3板子,有如下代码: m ...
- fun在matlab里面啥意思_matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢。谢谢~~...
导航:网站首页 > matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢.谢谢~~ matlab 中.*和*有什么区别 matlab 中| || ~ 都是什么含义呢. ...
- 导入matlab某两列数据,将文本文件中的数据导入到matlab中一例(wwh)
将文本文件(.txt)中的数据导入到matlab中一例 山东水利职业学院王为洪 247128324@http://www.doczj.com/doc/5d97a7dfad51f01dc281f1fd. ...
- Python创建类似Matlab中的cell数组
转载自:https://blog.csdn.net/raby_gyl/article/details/78016690,本文只做个人记录学习使用,版权归原作者所有. npose = 5 nsmile ...
- matlab中psnr多了50,matlab中中图像PSNR和SSIM的计算
网上找了很多关于PSNR和SSIM的计算,很多结果算出来都不一样,公式都是普遍的,如下: 现在总结下造成结果差异的原因. PSNR的差异:1.灰度图像:灰度图像比较好计算只有一个值. 2.彩色图像:a ...
最新文章
- nacos 负载策略_Spring Cloud Alibaba:Nacos 作为注册中心和配置中心使用
- [转] L1 L2范数
- Redis 作为缓存服务器的配置
- Android中ImageView常用属性含义
- jenkins角色权限管理
- 第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍
- Android 网络异常
- SpringCloud Ribbon负载均衡介绍及使用
- Android ADB 用法
- UVA11021 Tribles
- python报告,python测试结果报告
- 【游戏开发实战】下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)
- 数学建模暑期集训28:元胞自动机
- 虚拟打印机 android版,虚拟打印机(SmartPrinter)
- 前传智播客郭永锋最新工作室javaweb2018年4月班视频教程
- Authing 实力上榜安全牛《中国网络安全行业全景图》
- 数据库备份:Xtrabackup实现完全备份及增量备份
- 浅谈安卓apk安装过程中的设计模式
- 哈工大软件构造第一章
- 视频压缩技术及安卓中用法