小赵学习Opencv(3)之高效图像遍历循环
2015-03-11 19:35
148 查看
本文主要实现了图像的负片算法,具体实现过程中,分别采用了四种遍历图像像素的方式,并对其遍历时间进行了对比。
四种访问方式分别如下:
【方式一类数组方式】
【测试代码】
【运行时间效果对比】
由上图可知,通过指针方式遍历优于通过迭代器方式遍历,通过迭代器方式遍历优于通过数组器方式遍历。
四种访问方式分别如下:
【方式一类数组方式】
void Negative1(Mat image, Mat &result) { result.create(image.size(), image.type()); result.setTo(0); int i, j; int nl = image.rows;//行数 int nc = image.cols;//列数 for (int j = 0; j < nl; j++) { for (int i = 0; i < nc; i++) { result.at<Vec3b>(j, i)[0] = 255 - image.at<Vec3b>(j, i)[0]; result.at<Vec3b>(j, i)[1] = 255 - image.at<Vec3b>(j, i)[1]; result.at<Vec3b>(j, i)[2] = 255 - image.at<Vec3b>(j, i)[2]; } } }【方式二迭代器方式】
void Negative2(Mat image, Mat &result) { result.create(image.size(), image.type()); result.setTo(0); Mat_<Vec3b>::iterator it = image.begin<Vec3b>(); Mat_<Vec3b>::iterator itend = image.end<Vec3b>(); Mat_<Vec3b>::iterator itt = result.begin<Vec3b>(); for (; it != itend; ++it, ++itt) { (*itt)[0] = 255 - (*it)[0]; (*itt)[1] = 255 - (*it)[1]; (*itt)[2] = 255 - (*it)[2]; } }【方式三指针方式】
void Negative3(Mat image, Mat &result) { result.create(image.size(), image.type()); result.setTo(0); int i; int n = image.cols*image.rows*image.channels();//列数 uchar *src = image.ptr<uchar>(0); uchar *dest = result.ptr<uchar>(0); for (i = 0; i < n ; i++) { *dest = 255 - *src; dest++, src++; } }【方式四改进指针方式】
void Negative4(Mat image, Mat &result) { result.create(image.size(), image.type()); result.setTo(0); int i; int n = image.cols*image.rows;//列数 uchar *src = image.ptr<uchar>(0); uchar *dest = result.ptr<uchar>(0); for (i = 0; i < n; i++) { *dest = 255 - *src; dest++, src++; *dest = 255 - *src; dest++, src++; *dest = 255 - *src; dest++, src++; } }
【测试代码】
int main() { Mat image = imread("1.jpg"); if (image.empty()) { cout << "read file error!" << endl; return -1; } Mat result1, result2, result3, result4; double duration; duration = static_cast<double>(getTickCount()); Negative1( image, result1); duration = static_cast<double>(getTickCount())-duration; duration /= getTickFrequency(); cout << "time consume is " << duration << " ms."<<endl; duration = static_cast<double>(getTickCount()); Negative2(image, result2); duration = static_cast<double>(getTickCount()) - duration; duration /= getTickFrequency(); cout << "time consume is " << duration << " ms." << endl; duration = static_cast<double>(getTickCount()); Negative3(image, result3); duration = static_cast<double>(getTickCount()) - duration; duration /= getTickFrequency(); cout << "time consume is " << duration << " ms." << endl; duration = static_cast<double>(getTickCount()); Negative4(image, result4); duration = static_cast<double>(getTickCount()) - duration; duration /= getTickFrequency(); cout << "time consume is " << duration << " ms." << endl; imshow("0", image); imshow("1", result1); imshow("2", result2); imshow("3", result3); imshow("4", result4); waitKey(0); system("pause"); return 0; }
【运行时间效果对比】
由上图可知,通过指针方式遍历优于通过迭代器方式遍历,通过迭代器方式遍历优于通过数组器方式遍历。
相关文章推荐
- OPENCV学习笔记2-4_编写高效的图像扫描循环
- opencv学习(5) 使用迭代器遍历图像的像素
- opencv 2.x学习笔记(六) 扫描、遍历图像
- opencv学习(三)之图像像素遍历(颜色空间缩减、查找表)
- OPENCV学习笔记2-3_图像遍历(迭代器)
- opencv学习笔记之对灰度图像遍历的三种方法
- Opencv 例程讲解 3 ----如何高效的遍历图像
- opencv学习-Mat类图像遍历
- opencv学习笔记之对灰度图像遍历的三种方法
- OpenCV学习C++接口:图像遍历+像素压缩
- OPENCV学习笔记2-2_图像遍历(使用指针)
- OpenCV学习之三:使用迭代器遍历图像
- 高效的图像遍历循环
- 学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化
- OpenCV 2 学习笔记(7): 如何更有效率的循环扫描图像
- opencv学习笔记(02)——遍历图像(指针法)
- 小赵学习Opencv(2)之椒盐噪声及图像锐化
- opencv高效访问图像像素(遍历像素的方法总结)
- 【学习opencv】opencv中遍历图像以及Mat类变量解释
- 学习《OpenCV 2 计算机视觉编程手册》第二章---使用指针遍历图像案例