OpenCV——颜色缩减、计时函数、访问像素

 1 //颜色空间缩减
 2 //src:源图片
 3 //dst:目标图片
 4 //divideWith:缩减宽度
 5 void ColorSpaceReduction(Mat src,int divideWith,Mat& dst)
 6 {
 7     //创建查询用的表
 8     uchar table[256];
 9     for (int i = 0; i < 256; ++i)
10         table[i] = divideWith * (i / divideWith);
11     //创建mat型用于LUT函数查表
12     Mat lookUpTable(1, 256, CV_8U);
13     uchar* p = lookUpTable.data;
14     for (int i = 0; i < 256; ++i)
15         p[i] = table[i];
16     //src是输入dst是输出
17     LUT(src, lookUpTable, dst);
18
19 }

1 double time0 = static_cast<double>(getTickCount());//记录起始时间
2
3 time0 = ((double)getTickCount() - time0) / getTickFrequency();
4 cout << "运行时间为 "<< time0 << "秒"<<endl;//输出运行时间

访问像素的三种方法

【方法1】指针访问,c语言操作符[ ](速度最快,但有越界的风险)

 1     int rowNumber = dst.rows;//行数
 2     int colNumber = dst.cols*dst.channels();//列数*通道数=每一行的元素个数
 3
 4     //循环遍历每个元素
 5     for (int i = 0; i < rowNumber; i++)//行循环
 6     {
 7         uchar* data = dst.ptr<uchar>(i);//获取第i行首地址
 8         for (int j=0; j < colNumber; j++)//列循环
 9             data[j] = data[j] / div* div+div/2;//颜色缩减操作    //也可以写成   *data++=*data/div*div+div/2;
10     }

【方法2】迭代器iterator(绝对安全,不会越界)

1     Mat_<Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置的迭代器
2     Mat_<Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置的迭代器
3     //彩色图像每个像素有3个通道
4     for (; it != itend; ++it)
5     {
6         (*it)[0] = (*it)[0] / div * div + div / 2;
7         (*it)[1] = (*it)[1] / div * div + div / 2;
8         (*it)[2] = (*it)[2] / div * div + div / 2;
9     }

【方法1】动态地址计算(最慢)

 1     int rowNumber = dst.rows;//行数
 2     int colNumber = dst.cols;//列数
 3     for (int i = 0; i < rowNumber; i++)
 4     {
 5         for (int j = 0; j < colNumber; j++)
 6         {
 7             //彩色图像每个像素有3个通道
 8             dst.at<Vec3b>(i, j)[0] = dst.at<Vec3b>(i, j)[0] / div * div + div / 2;
 9             dst.at<Vec3b>(i, j)[1] = dst.at<Vec3b>(i, j)[1] / div * div + div / 2;
10             dst.at<Vec3b>(i, j)[2] = dst.at<Vec3b>(i, j)[2] / div * div + div / 2;
11
12         }
13     }

原文地址:https://www.cnblogs.com/long5683/p/9651442.html

时间: 2024-10-08 14:58:48

OpenCV——颜色缩减、计时函数、访问像素的相关文章

opencv学习(5)图像像素的访问、颜色通道的分离和融合

代码都是源于毛星云的<opencv3.0编程入门> 1.计时函数 getTickCount()和getTickFrequency()函数: getTickCount()函数返回CPU自某个事件以来走过的时钟周期: getTickFrequency()函数 返回CPU一秒所走的周期数: 事例: double time0=static_cast< double>(getTickCount()); //记录起始时间 // 事件的处理操作 time0=((double)getTickCou

【OpenCV学习笔记】一.操作像素

近来给自己开个新坑,打算学习下OpenCV这一计算机视觉库. 参考资料:<OpenCV 2 计算机视觉 编程手册> [以下内容默认版本OpenCV 2.3.1] 最简单的操作莫过于对于一张图片上的像素的遍历了,然而,遍历的方式有很多种,如何取舍很是关键. 简单介绍几种常见的方式: 1.指针遍历: int row = image.rows; int col = image.cols * image.channels(); for(int i = 0; i < row; i++) { uch

怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

  分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.bmp", 0 ); 这样图像已经灰度化,然后调用cvThreshold(image, image, 125, 255, CV_THRESH_BINARY); 就可以了,125那里是你所用的阈值,这就是最简单的二值化,你要用ostu,或者别的高级一点的,就要自己写函数了   // Truncate v

访问像素的三种方法

方法一:用指针访问像素 1 #include <opencv2/opencv.hpp> 2 #include <opencv2/core/core.hpp> 3 #include <opencv2/highgui/highgui.hpp> 4 using namespace cv; 5 using namespace std; 6 void colorReduce(Mat &inputImage,Mat& outputImage,int div) 7 {

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

OpenCV的阈值化函数threshold

在OpenCV中,threshold用来进行对图像(二维数组)的二值化阈值处理 通过查找OpenCV在线文档,发现存在很多函数: 其函数原型如下: 1. C版本的:函数原型: void cvThreshold( const CvArr* src, CvArr* dst, double threshold,double max_value, int threshold_type ); src,dst: 不必多说,其要求类型一致性: threshold:需要设置的阈值,当像素值大于某个数字时,设定一

用opencv读取图像鼠标点的像素,更正一个Bug

作者:skyseraph 出处:http://www.cnblogs.com/skyseraph/ 以下代码在网上流传很广. 不过,调试运行之后发现,功能是正确的,但是内存很快就耗尽,导致死机.经过查找,加上: cvReleaseImage(&img1);    //释放源图像占用的内存 这一行是我(szliug)加的,否则内存很快就会耗尽,会死机的. 之后运行正常. /*===============================================// 功能:OpenCV Ut

OpenCV的基本绘图函数

相关函数介绍 [-] 相关函数介绍 Point Scalar Rectangle Line Ellipse PolyLine PutText 示例代码 实验结果 1. Point 该数据结构表示了由其图像坐标 和 指定的2D点.可定义为: Point pt; pt.x = 10; pt.y = 8; 或者 Point pt = Point(10, 8); Scalar 表示了具有4个元素的数组.次类型在OpenCV中被大量用于传递像素值. 本节中,我们将进一步用它来表示RGB颜色值(三个参数).

Linux下clock计时函数学习

平时在Linux和Winows下都有编码的时候,移植代码的时候免不了发现一些问题.1. 你到底准不准?关于clock()计时函数首先是一段简单的测试代码,功能为测试从文本文件读取数据并赋值给向量最后打印输出的运行时间. int main(int argc, char **argv){    clock_t t1=clock();ifstream in("data.txt");vector<int> v;for(int a;in>>a;v.push_back(a)