訪問圖像像素的三種方法:指針訪問,迭代器訪問,動態地址訪問。訪問最快的為指針訪問,以下算法在幾毫秒,但指針訪問容易造成內存泄漏;其次為迭代器訪問;最后為動態地址訪問。
以下程序是根據《OpenCV3編程入門》一書5.1.5訪問圖像中像素的三類方法,在VS2013使用OpenCV3.0編程完成的指針、迭代器、動態地址三類像素訪問方式編寫的案例程序。代碼為上述書目中的源碼,被筆者分別封裝在三個函數之內,作為學習筆記,以便日后查閱。
#include <opencv2\opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;
void colorReduce_Iterator(Mat& srcImage, Mat& outImage,
int div)
{outImage = srcImage.clone();Mat_<Vec3b>::iterator it = outImage.begin<Vec3b>();Mat_<Vec3b>::iterator itend = outImage.end<Vec3b>();
for (; it != itend; ++it){(*it)[
0] = (*it)[
0] /
div*
div +
div /
2;(*it)[
1] = (*it)[
1] /
div*
div +
div /
2;(*it)[
2] = (*it)[
2] /
div*
div +
div /
2;}
}
void colorReduce_Point(Mat& srcImage, Mat& outImage,
int div)
{outImage = srcImage.clone();
int rowNumber = outImage.rows;
int colNumber = outImage.cols*outImage.channels();
for (
int i =
0; i < rowNumber; i++){uchar* data = outImage.ptr<uchar>(i);
for (
int j =
0; j < colNumber; j++){data[j] = data[j] /
div*
div +
div /
2;}}}
void colorReduce_At(Mat& srcImage, Mat& outImage,
int div)
{outImage = srcImage.clone();
int rowNumber = outImage.rows;
int colNumber = outImage.cols;
for (
int i =
0; i < rowNumber; i++){
for (
int j =
0; j < colNumber; j++){outImage.at<Vec3b>(i, j)[
0] = outImage.at<Vec3b>(i, j)[
0] /
div *
div +
div /
2;outImage.at<Vec3b>(i, j)[
1] = outImage.at<Vec3b>(i, j)[
1] /
div *
div +
div /
2;outImage.at<Vec3b>(i, j)[
2] = outImage.at<Vec3b>(i, j)[
2] /
div *
div +
div /
2;}}
}
void main()
{Mat srcImage = imread(
"lenna.png");imshow(
"【原始圖像】", srcImage);Mat dstImage;dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());
double time0 = static_cast<
double>(getTickCount());colorReduce_Point(srcImage, dstImage,
32);time0 = ((
double)getTickCount() - time0) / getTickFrequency();cout <<
"此方法運行時間為:" << time0 <<
"秒" << endl;imshow(
"【目標圖】", dstImage);waitKey(
0);
}
實驗運行原圖
實驗像素處理后的目標圖(三種方式處理后的目標圖效果相同)
三種方式處理耗費時間
【指針】
【迭代器】
【動態地址】
總結
以上是生活随笔為你收集整理的Opencv3编程入门学习笔记(三)之访问图像像素的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。