Opencv2--顏色縮減(兩種方法實現 1.迭代器 2.指針)

// ColorReduce.cpp : Defines the entry point for the console application.
/*-----CODE FOR FUN---------------
-------CREATED BY Dream_Whui------
-------2015-3-9-------------------------*/  
//顏色縮減

#include "stdafx.h"
#include <iostream>
#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;

void ColorReduce(Mat &image, int div=64)
{
    int nl = image.rows;//行數
    int nc = image.cols * image.channels();
    for(int j=0; j<nl; j++)
    {
        uchar *data = image.ptr<uchar>(j);
        for(int i=0; i<nc; i++)
            data[i] = data[i] /div *div + div/2;
    }
}

void ColorReduce_itor(Mat &image, int div=64)
{
    Mat_<Vec3b>:: iterator it = image.begin<Vec3b>();
    Mat_<Vec3b>:: iterator itend = image.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;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    Mat image = imread("pic.jpg");
    Mat image_1 = image.clone();

    namedWindow("image_raw");
    imshow("image_raw",image);

    double duration;
    duration = static_cast<double>(getTickCount());
    ColorReduce(image,64);
    duration = static_cast<double>(getTickCount()) - duration;
    duration /= getTickFrequency();
    cout<<"指針耗費時間:"<<duration<<endl;
    namedWindow("image");
    imshow("image",image);

    duration = static_cast<double>(getTickCount());
    ColorReduce_itor(image_1,64);
    duration = static_cast<double>(getTickCount()) - duration;
    duration /= getTickFrequency();
    cout<<"迭代器耗費時間:"<<duration<<endl;
    namedWindow("image_itor");
    imshow("image_itor",image_1);

    waitKey();
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章