opencv学习笔记(02)——遍历图像(指针法)

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>

void colorReduce(cv::Mat& image, int div=64)
{
    int nr = image.rows;    
    int nc = image.cols * image.channels();

    int n = static_cast<int>( cv::log(static_cast<double>(div)) / cv::log(2.0) );
    uchar mask = 0xFF << n;

    for(int i=0; i<nr; i++)
    {
        uchar* data = image.ptr<uchar>(i);
        for(int j=0; j<nc; j++)
        {
            //*data++ = *data - *data % div + div / 2;
            *data++ = (*data & mask) + div / 2;
        }
    }

}


int main(int argc, char** argv)
{

    cv::Mat img = cv::imread("F:\\images\\boldt.jpg");    
    cv::Mat img2 = img.clone();    

    double duration;
    duration = static_cast<double>(cv::getTickCount());

    colorReduce(img2);
    duration = static_cast<double>(cv::getTickCount()) - duration;
    duration /= cv::getTickFrequency();

    cv::namedWindow("original");    
    cv::imshow("original", img);
    cv::namedWindow("altered");    
    cv::imshow("altered", img2);

    std::cout << duration << std::endl;

    cv::waitKey(0);
    return 0;

}

 

posted @ 2014-05-17 21:37  prepat  阅读(734)  评论(0编辑  收藏  举报