根据《面向飞机蒙皮接缝的线结构光检测技术研究_张卡》论文中的原理,编写了自适应阈值函数

原理:


 //计算灰度最大最小值
void MaxGrayValue(Mat image,int &max,int &min)
{
max = ;
min = ;
Mat *im = reinterpret_cast<Mat*>((void*)&image);
int height = image.rows;
int width = image.cols;
int N = height * width;
//cout << "125" << " " << "125" << " " << static_cast<int>(im->at<uchar>(Point(182, 190))) << endl;
for (int i = ; i < height; i++)
{
for (int j = ; j < width; j++)
{
if ((static_cast<int>(im->at<uchar>(Point(j, i))))>max)
max = static_cast<int>(im->at<uchar>(Point(j, i)));
else if ((static_cast<int>(im->at<uchar>(Point(j, i))))<min)
min = static_cast<int>(im->at<uchar>(Point(j, i)));
}
}
}

 //自适应阈值 注:传入的只能是灰度图像
void adapthreshold(Mat &image)
{
int max, min; //保存最大和最小灰度值
MaxGrayValue(image, max, min); //计算出最大最小灰度值
int grayvalue; //用于暂时存取每个点的灰度值
int Threshold = (max + min)/; //初始阈值
int Temp_Threshold = Threshold; //用于存取每次迭代后的阈值
int big_than_th; //用于累加大于阈值的灰度值
int bigcount; //用于存放大于阈值灰度值的像素点数量
int sma_than_th; //用于累加小于阈值的灰度值
int smacount; //用于存放小于阈值灰度值的像素点数量
Mat *im = reinterpret_cast<Mat*>((void*)&image); //获取像素点信息
//Mat *im = &image;
int height = image.rows; //获取图像高度
int width = image.cols; //获取图像宽度 for (int k = ; k < ; k++) //计算阈值,最大迭代50次
{
big_than_th = ;
bigcount = ;
sma_than_th = ;
smacount = ;
for (int i = ; i < height; i++)
{
for (int j = ; j < width; j++)
{
grayvalue = static_cast<int>(im->at<uchar>(Point(j, i))); //获取指定点灰度值
if (grayvalue>Threshold) //如果灰度值大于阈值,加到总灰度值,数量+1
{
big_than_th += grayvalue;
bigcount++;
}
else if (grayvalue < Threshold) //如果灰度值小于阈值,加到总灰度值,数量+1
{
sma_than_th += grayvalue;
smacount++;
}
}
}
Temp_Threshold = ((big_than_th*1.0 / bigcount) + (sma_than_th*1.0 / smacount)) / ; //计算新的阈值
if (abs(Temp_Threshold - Threshold) < ) //如果新的阈值和旧的阈值差值的绝对值小于10,则退出
break;
else
Threshold = Temp_Threshold; //否则旧阈值等于新阈值
}
for (int i = ; i < height; i++) //对图像进行二值化处理
{
uchar* data = image.ptr<uchar>(i);
for (int j = ; j < width; j++)
{
grayvalue = static_cast<int>(im->at<uchar>(Point(j, i)));
if (grayvalue>Threshold)
data[j] = ;
else if (grayvalue < Threshold)
data[j] = ;
}
}
}

opencv中自适应阈值函数的实现(c++)的更多相关文章

  1. Opencv中的阈值函数

    OpenCV基础——threshold函数的使用 图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果. 参数原型 参数说明 src:源图像,可以为8位的灰度 ...

  2. OpenCV中的绘图函数-OpenCV步步精深

    OpenCV 中的绘图函数 画线 首先要为画的线创造出环境,就要生成一个空的黑底图像 img=np.zeros((512,512,3), np.uint8) 这是黑色的底,我们的画布,我把窗口名叫做i ...

  3. OpenCV中的常用函数

    1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序 ...

  4. 【计算机视觉】OpenCV中直方图处理函数简述

    计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...

  5. opencv:自适应阈值

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  6. OpenCV中的新函数connectedComponentsWithStats使用

    主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域. 关键字    :connectedComponentsWithStats 在以前,常用的方法是"是先调用 cv ...

  7. 5、opencv中的绘图函数

    1.目标 a.学习使用 OpenCV 绘制不同几何图形 b. 你将会学习到这些函数: cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse(),c ...

  8. OpenCV中的绘图函数

    OpenCV可以用来绘制不同的集合图形,包括直线,矩形,圆,椭圆,多边形以及在图片上添加文字.用到的绘图函数包括 cv2.line(),cv2.circle(),cv2.rectangle() ,cv ...

  9. opencv中的exp32f函数

    exp32f opencv的exp函数和cmath的exp函数在精度上存在一定差异,通过查找源码,发现了这么一段实现.代码如下: 点击查看代码 #define EXPTAB_SCALE 6 #defi ...

随机推荐

  1. ISO/IEC 9899:2011 条款6.2.7——兼容类型与组合类型

    6.2.7 兼容类型与组合类型 1.两个类型具有兼容类型,如果它们的类型是相同的.用于判定两个类型是否兼容的其它规则在6.7.2关于类型说明符中,6.7.3关于类型说明符中,6.7.6关于声明符中描述 ...

  2. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_04-用户认证-认证服务查询数据库-查询用户接口-接口开发

    定义dao 权限放在授权的课程里面做,现在先不管.我们还需要查企业信息,就是用户所属的公司 公司表 对应关系在xc_company 这是一个关系 表 这个表里有唯一索引 user_id 所以根据use ...

  3. JS微信网页使用图片预览(放大缩小)

    前言 需求在微信网页中客户点击图片可进行预览放大缩小功能,网上找了各种js方式实现, 唯一的麻烦就是不兼容或者和项目框架不兼容 次函数只只用于部分客户端,否则会出现 WeixinJSBridge is ...

  4. C#关于DateTime得到的当前时间的格式和用法

    DateTime.Now.ToShortTimeString() DateTime dt = DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.T ...

  5. iOS开发设计模式

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

  6. XenServer 根分区空间满的解决办法

    1.清除已经应用的旧补丁文件 删除 /var/patch/ 下的除 applied 之外的所有文件 2.清除旧版的Xen-Tools文件 删除 /opt/xensource/packages/iso/ ...

  7. 欧姆龙_NX1P_PLC功能模块_限定安全作业空间

    程序  和说明 以及流程图 已上传到百度云盘 https://pan.baidu.com/s/1kYF11pQHJ4VxyaXr8E_gAA 主要是用来向量的叉乘  判断俩向量正向夹角

  8. java基础系列(二):java数据结构及常用方法

    1.数组Array (1)创建数组 dataType[] arrayName = new dataType[length];必须指定大小,否则会报错:如果不想指定大小,应采用声明数组变量的方式 dat ...

  9. git merge仓

    git merge --no-ff branch 合并指定代码 如果有冲突 git mergetool   可视化解决冲突, qa! 全退出 如果修复失败 git checkout branch -f ...

  10. cadence 16.3 安装教程

    http://wenku.baidu.com/link?url=mGICX2QxuxVcYGNEaOIUOK1t0LQFN4m8cp_bJF0XmvZp0TLn8OoMxjmXa-8mTa0_V0YV ...