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 ...
随机推荐
- 如果前面的IO操作出问题了,按照我们代码的意思,不就try catch 了吗,这样的话线程就没关闭了,就会造成线程泄露。 那怎么解决这个问题呢,其实也简单,把关闭线程的方法写到finally里就可以了。
https://mp.weixin.qq.com/s/WaNVT2bZFGHNO_mb5nK6vw 连HDFS源码大神都会犯的错之线程泄露(1) 西瓜老师 西瓜老师爱大数据 1月11日
- ISO/IEC 9899:2011 条款6.4.6——标点符号
6.4.6 标点符号 语法 1.以下之一 [ ] ( ) { } . -> ++ -- & * + - ...
- R-CNN论文学习
Rich feature hierarchies for accurate object detection and semantic segmentation Tech report (v5) pr ...
- zblog模板怎么安装?zblog主题安装教程
有很多初次使用zblog的新手还会问我“zblog模板怎么安装?”,那么本文就专门给大家介绍下zblog主题安装教程. zblog现在分为zblogasp和zblogphp两个版本,两个版本的模板主题 ...
- webpack——Modules && Hot Module Replacement
blog:JavaScript Module Systems Showdown: CommonJS vs AMD vs ES2015 官网链接: Modules 官网链接:Hot Module Rep ...
- 123457123456#0#-----com.yuming.HitMouse01--前拼后广--幼儿打地鼠游戏
com.yuming.HitMouse01--前拼后广--幼儿打地鼠游戏
- pod install [!] Unable to find a specification for `XXX`
今天下载了别人的源码学习的时候,执行pod install报错如下: 解决办法: 更新下pod即可. pod update install成功.
- jquery iframe取得元素与自适应高度
总结一下iframe在jquery中怎么操作的,下面我来给各位介绍jquery 获取iframe子/父页面的元素及iframe在jquery高度自适应实现方法,各位朋友可参考. jquery方法: 在 ...
- 【C# 开发技巧】 Application.DoEvents( ) 使用笔记
该方法可以处理当前队列的消息,比如一个for循环 5000次 向TextBox中追加文本,那肯定会假死一会儿的. 此时便可使用Application.DoEvents()来处理队列的信息. 简单说下使 ...
- 【Kail 学习笔记】Dmitry信息收集工具
DMitry(Deepmagic Information Gathering Tool)是一个一体化的信息收集工具.它可以用来收集以下信息: 根据IP(或域名)来查询目标主机的Whois信息 在Net ...