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 ...
随机推荐
- 初识kaggle,以及记录 kaggle的使用
1.简介:Kaggle是一个数据建模和数据分析竞赛的平台.企业和研究者可在其上发布数据,统计学者和数据挖掘专家可在其上进行竞赛,通过“众包”的形式以产生最好的模型.Kaggle可以分为Competit ...
- DBUtil内部实现过程解读
python数据库连接工具DBUtils DBUtils是一个允许在多线程python应用和数据库之间安全及高效连接的python模块套件. 模块 DBUtils套件包含两个模块子集,一个适用于兼容D ...
- 17flutter中的路由/命名路由/命名路由传值/无状态组件传值/有状态组件传值。
main.dart import 'package:flutter/material.dart'; import 'package:flutter_demo/pages/Search.dart'; i ...
- java 利用poi 实现excel合并单元格后出现边框有的消失的解决方法
使用工具类RegionUtil CellRangeAddress cra = new CellRangeAddress(nowRowCount, nowRowCount + followSize-1, ...
- 123456---com.twoapp.huanYingMotro--- 幻影摩托
123456---com.twoapp.huanYingMotro--- 幻影摩托
- K8s常用命令操作
K8s常用命令操作 一.kubectl命令补全 1.master安装命令补全,并临时生效 yum install -y bash-completion source /usr/share/bash-c ...
- CX ONE 不能全屏
兼容性 win7 以管理员方式运行 1. 打开CX-Programmer,选择“工具”——“选项”:2. 点击“通用”选项卡,选择“高级”:3. 勾选“当下一次启动CX-Programmer时不显示 ...
- pip3 install pyinstaller 报错了的处理方法
http://www.pyinstaller.org/downloads.html 下载压缩包 解压到本地后,在目录处cmd 执行命令 python setup.py install 然后执行pip ...
- 性能测试loadrunner11工具再也不用担心浏览器兼容的问题了(目前试过的各版本浏览器都是成功的)
工具:Loadrunner 11.0+Fiddler+浏览器(谷歌.火狐.IE等) 步骤一:查看抓包工具Fiddler对应的端口 1.打开Fiddler------工具------选项-----连接, ...
- Docker容器中用户权限管理
在Linux系统中有一部分知识非常重要,就是关于权限的管理控制:Linux系统的权限管理是由uid和gid负责,Linux系统会检查创建进程的uid和gid,以确定它是否有足够的权限修改文件,而非是通 ...