Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问。访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏;其次为迭代器访问;最后为动态地址访问。
以下程序是根据《OpenCV3编程入门》一书5.1.5访问图像中像素的三类方法,在VS2013使用OpenCV3.0编程完成的指针、迭代器、动态地址三类像素访问方式编写的案例程序。代码为上述书目中的源码,被笔者分别封装在三个函数之内,作为学习笔记,以便日后查阅。

#include 
#include 

using namespace cv;
using namespace std;

//迭代器访问像素
void colorReduce_Iterator(Mat& srcImage, Mat& outImage, int div)
{
    outImage = srcImage.clone();
    Mat_::iterator it = outImage.begin();//初始位置迭代器
    Mat_::iterator itend = outImage.end();//终止位置迭代器

    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(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(i, j)[0] = outImage.at(i, j)[0] / div *div + div / 2;//channel0
            outImage.at(i, j)[1] = outImage.at(i, j)[1] / div *div + div / 2;//channel1
            outImage.at(i, j)[2] = outImage.at(i, j)[2] / div *div + div / 2;//channel2
        }
    }
}

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_At(srcImage, dstImage, 32);
    colorReduce_Point(srcImage, dstImage, 32);
    //colorReduce_Iterator(srcImage, dstImage, 32);

    //计算运行时间并输出
    time0 = ((double)getTickCount() - time0) / getTickFrequency();
    cout << "此方法运行时间为:" << time0 << "秒" << endl;

    imshow("【目标图】", dstImage);

    waitKey(0);
}

实验运行原图
Opencv3编程入门学习笔记(三)之访问图像像素的三种方法_第1张图片
实验像素处理后的目标图(三种方式处理后的目标图效果相同)
Opencv3编程入门学习笔记(三)之访问图像像素的三种方法_第2张图片

三种方式处理耗费时间
【指针】
这里写图片描述
【迭代器】
这里写图片描述
【动态地址】
这里写图片描述

你可能感兴趣的:(C++,Opencv)