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

//计算灰度最大最小值
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 = ℑ
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++)的更多相关文章
- Opencv中的阈值函数
OpenCV基础——threshold函数的使用 图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果. 参数原型 参数说明 src:源图像,可以为8位的灰度 ...
- OpenCV中的绘图函数-OpenCV步步精深
OpenCV 中的绘图函数 画线 首先要为画的线创造出环境,就要生成一个空的黑底图像 img=np.zeros((512,512,3), np.uint8) 这是黑色的底,我们的画布,我把窗口名叫做i ...
- OpenCV中的常用函数
1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序 ...
- 【计算机视觉】OpenCV中直方图处理函数简述
计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...
- opencv:自适应阈值
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- OpenCV中的新函数connectedComponentsWithStats使用
主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域. 关键字 :connectedComponentsWithStats 在以前,常用的方法是"是先调用 cv ...
- 5、opencv中的绘图函数
1.目标 a.学习使用 OpenCV 绘制不同几何图形 b. 你将会学习到这些函数: cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse(),c ...
- OpenCV中的绘图函数
OpenCV可以用来绘制不同的集合图形,包括直线,矩形,圆,椭圆,多边形以及在图片上添加文字.用到的绘图函数包括 cv2.line(),cv2.circle(),cv2.rectangle() ,cv ...
- opencv中的exp32f函数
exp32f opencv的exp函数和cmath的exp函数在精度上存在一定差异,通过查找源码,发现了这么一段实现.代码如下: 点击查看代码 #define EXPTAB_SCALE 6 #defi ...
随机推荐
- 自定义控件的属性declare-styleable
在res/values文件下定义一个attrs.xml文件,代码如下: <?xml version="1.0" encoding="utf-8"?> ...
- Syste类
System类的概述 System 类包含一些有用的类字段和方法.它不能被实例化. 成员方法 public static void gc() 运行垃圾回收器. public static void ...
- C#实现简单的 Ping 的功能,用于测试网络是否已经联通
/// <summary> /// 是否能 Ping 通指定的主机 /// </summary> /// <param name="ip">ip ...
- linux chown 命令用法
[-cfhvR] [--help] [--version] user[:group] file 比如 chown chown root /home 把/home的属主改成root用户使用权限 : ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_03-用户认证-认证服务查询数据库-查询用户接口-接口定义
1.2.4 查询用户接口 完成用户中心根据账号查询用户信息接口功能. 在ucenter这个服务里面定义查询用户信息的接口 这个接口在auth的服务的loadUserByUserName这个方法里面被调 ...
- APP手工项目02-用例编写-测试报告-fiddler弱网测试
回顾 APP专项测试(兼容性,安装,卸载,升级,交叉事件,PUSH消息,性能,其他类型) 项目环境(开发环境,测试环境,准生产环境,生产环境) APP内测发布平台(蒲公英,fir.im)支持apk,i ...
- 基于pythonselect.select模块通信的实例讲解
基于python select.select模块通信的实例讲解 要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值. select()方法接收并监控3个通信列表, 第一 ...
- 01.轮播图之二 :tableView 轮播
在做这个tablevew轮播的时候,重要的就是修改frame 和view 的翻转了:::: 也是不难的,概要的设计和scroll 轮播是一致的: 首先是 .h 的文件 @interface Table ...
- Azure Web应用相关设置
这里用来记录自己在工作中,在Azure Web应用中用到的配置 设置NodeJS版本 Azure Web应用默认的NodeJS版本是0.10.4,这个版本太低,不能满足实际的需要 参照下图修改,根据自 ...
- VLOOKUP函数 from Excel
1.VLOOKUP函数是Excel中的一个纵向查找函数,它与LOOKUP函数和HLOOKUP函数属于一类函数,在工作中都有广泛应用,例如可以用来核对数据,多个表格之间快速导入数据等函数功能.功能是按列 ...