opencv中自适应阈值函数的实现(c++)

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

原理:



 1 //计算灰度最大最小值
 2 void MaxGrayValue(Mat image,int &max,int &min)
 3 {
 4     max = 0;
 5     min = 255;
 6     Mat *im = reinterpret_cast<Mat*>((void*)&image);
 7     int height = image.rows;
 8     int width = image.cols;
 9     int N = height * width;
10     //cout << "125" << " " << "125" << " " << static_cast<int>(im->at<uchar>(Point(182, 190))) << endl;
11     for (int i = 0; i < height; i++)
12     {
13         for (int j = 0; j < width; j++)
14         {
15             if ((static_cast<int>(im->at<uchar>(Point(j, i))))>max)
16                 max = static_cast<int>(im->at<uchar>(Point(j, i)));
17             else if ((static_cast<int>(im->at<uchar>(Point(j, i))))<min)
18                 min = static_cast<int>(im->at<uchar>(Point(j, i)));
19         }
20     }
21 }

1 //自适应阈值 注:传入的只能是灰度图像
 2 void adapthreshold(Mat &image)
 3 {
 4     int max, min;    //保存最大和最小灰度值
 5     MaxGrayValue(image, max, min);   //计算出最大最小灰度值
 6     int grayvalue;    //用于暂时存取每个点的灰度值
 7     int Threshold = (max + min)/2;  //初始阈值
 8     int Temp_Threshold = Threshold; //用于存取每次迭代后的阈值
 9     int big_than_th;       //用于累加大于阈值的灰度值
10     int bigcount;           //用于存放大于阈值灰度值的像素点数量
11     int sma_than_th;       //用于累加小于阈值的灰度值
12     int smacount;           //用于存放小于阈值灰度值的像素点数量
13     Mat *im = reinterpret_cast<Mat*>((void*)&image);    //获取像素点信息
14     //Mat *im = &image;
15     int height = image.rows;   //获取图像高度
16     int width = image.cols;       //获取图像宽度
17
18
19     for (int k = 0; k < 50; k++)   //计算阈值,最大迭代50次
20     {
21         big_than_th = 0;
22         bigcount = 0;
23         sma_than_th = 0;
24         smacount = 0;
25         for (int i = 0; i < height; i++)
26         {
27             for (int j = 0; j < width; j++)
28             {
29                 grayvalue = static_cast<int>(im->at<uchar>(Point(j, i)));  //获取指定点灰度值
30                 if (grayvalue>Threshold)   //如果灰度值大于阈值,加到总灰度值,数量+1
31                 {
32                     big_than_th += grayvalue;
33                     bigcount++;
34                 }
35                 else if (grayvalue < Threshold) //如果灰度值小于阈值,加到总灰度值,数量+1
36                 {
37                     sma_than_th += grayvalue;
38                     smacount++;
39                 }
40             }
41         }
42         Temp_Threshold = ((big_than_th*1.0 / bigcount) + (sma_than_th*1.0 / smacount)) / 2;  //计算新的阈值
43         if (abs(Temp_Threshold - Threshold) < 2)   //如果新的阈值和旧的阈值差值的绝对值小于10,则退出
44             break;
45         else
46             Threshold = Temp_Threshold;    //否则旧阈值等于新阈值
47     }
48     for (int i = 0; i < height; i++)     //对图像进行二值化处理
49     {
50         uchar* data = image.ptr<uchar>(i);
51         for (int j = 0; j < width; j++)
52         {
53             grayvalue = static_cast<int>(im->at<uchar>(Point(j, i)));
54             if (grayvalue>Threshold)
55                 data[j] = 255;
56             else if (grayvalue < Threshold)
57                 data[j] = 0;
58         }
59     }
60 }

原文地址:https://www.cnblogs.com/Summerio/p/8280905.html

时间: 2024-10-14 11:51:36

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

openCV中的findHomography函数分析以及RANSAC算法的详解

本文将openCV中的RANSAC代码全部挑选出来,进行分析和讲解,以便大家更好的理解RANSAC算法.代码我都试过,可以直接运行. 在计算机视觉和图像处理等很多领域,都需要用到RANSAC算法.openCV中也有封装好的RANSAC算法,以便于人们使用.关于RANSAC算法的一些应用,可以看我的另一篇博客: 利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 但是前几天师弟在使用op

OpenCV中的常用函数

1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序暂停,等待用户触发一个按键操作: 5.cvReleaseImage:释放图像文件所分配的内存: 6.cvDestroyWindow:销毁显示图像文件的窗口: 7.cvCreateFileCapture:通过参数设置确定要读入的AVI文件: 8.cvQueryFrame:用来将下一帧视频文件载入内存:

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

计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列预定义的bins中.这里的数据不仅仅指的是灰度值 ,统计数据可能是任何能有效描述图像的特征. 假设有一个矩阵包含一张图像的信息 (灰度值 0-255): gray 既然已知数字的范围包含256个值, 我们可以将这个范围分割成子区域(称作 bins),如: bins 然后再统计掉入每一个bin_{i}的像素数目.采用这一方法来统计上面的数字矩阵,我们可以得到下图( x轴表示 bin, y轴表示各个bin中的像素个数).

(转)OpenCV中的常用函数

1.cvLoadImage:将图像文件加载至内存: 2.cvNamedWindow:在屏幕上创建一个窗口: 3.cvShowImage:在一个已创建好的窗口中显示图像: 4.cvWaitKey:使程序暂停,等待用户触发一个按键操作: 5.cvReleaseImage:释放图像文件所分配的内存: 6.cvDestroyWindow:销毁显示图像文件的窗口: 7.cvCreateFileCapture:通过参数设置确定要读入的AVI文件: 8.cvQueryFrame:用来将下一帧视频文件载入内存:

5、opencv中的绘图函数

1.目标 a.学习使用 OpenCV 绘制不同几何图形 b. 你将会学习到这些函数: cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse(),cv2.putText() 等. 2.代码 上面所有的这些绘图函数需要设置下面这些参数: img:你想要绘制图形的那幅图像. color: 形状的颜色. 以 RGB 为例, 需要传入一个元组, 例如: (255,0,0)代表蓝色.对于灰度图只需要传入灰度值. thickness:线条的粗细.如果给一个

OpenCV中的新函数connectedComponentsWithStats使用

主要内容:对比新旧函数,用于过滤原始图像中轮廓分析后较小的区域,留下较大区域. 关键字    :connectedComponentsWithStats 在以前,常用的方法是"是先调用 cv::findContours() 函数(传入cv::RETR_CCOMP 标志),随后在得到的连通区域上循环调用 cv::drawContours() " 比如,我在GOCVHelper中这样进行了实现 //寻找最大的轮廓 VP FindBigestContour(Mat src){ int ima

OpenCV中的绘图函数

OpenCV可以用来绘制不同的集合图形,包括直线,矩形,圆,椭圆,多边形以及在图片上添加文字.用到的绘图函数包括 cv2.line(),cv2.circle(),cv2.rectangle() ,cv2.putText() 等等. 这些绘图函数需要设置参数如: ? img:你想要绘制图形的那幅图像.? color:形状的颜色.以 RGB 为例,需要传入一个元组,例如: (255,0,0 )代表蓝色.对于灰度图只需要传入灰度值.? thickness:线条的粗细.如果给一个闭合图形设置为 -1,那

OpenCV中使用cvResize函数或resize函数进行图象放缩

//cvResize函数原型void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); src:输入图像.(IplImage) dst:输出图像.(IplImage) interpolation:差值方法: CV_INTER_NN - 最近邻差值 CV_INTER_LINEAR - 双线性差值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹

OpenCV中通过滑动条阈值分割多通道图像

1.阈值分割 阈值分割法是一种基于区域的图像分割技术.其基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类.根据图像阈值化算法所依据的信息源,可将阈值化方法分为五类:1) 基于聚类的方法:数据聚类中,总的数据集被划分为属性相似的子类,例如将灰度级聚类成为两部分:前景物体部分和背景部分.2) 基于直方图的方法:在直方图的峰.谷和直方图的圆滑曲线上进行分析.3) 基于熵的方法:熵方法将区域分为背景区域和前景区域,前景区域通常是物体部分(在一些热红外图像中,背景部分是物体) .该方法是通过最小