OpenCV之遍历像素,减小图像颜色[模糊],测试运行时间

#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;
/* 名字: 颜色空间缩减函数
 * 目的:减小图像中颜色的数量
 * 方法: 好比原来有256中颜色,要将其变成64种颜色:
 * 将原来的颜色/4而后乘以4就能够了
*/

/*   方法1:用指针访问像素,release时速度最快 0.0066653 */
void colorReducePtr(Mat &inputImage, Mat& outputImage, int div)
{
    //参数准备
    outputImage = inputImage.clone();   //复制实参到临时变量
    int rowNumber = outputImage.rows; //行数
    int colNumber = outputImage.cols * outputImage.channels();  //每一行元素的个数 = 类数 * 通道数

    //双for,遍历全部像素值
    for(int i = 0; i < rowNumber; ++i)  //行
    {
        uchar *data = outputImage.ptr<uchar>(i);  //获取第i行的首地址
        for(int j = 0; j < colNumber; ++j)
        {
            data[j] = data[j]/div*div + div/2; // 处理每个像素
            cout << data[j] << ends;
        }

    }
}

void colorReducePtr2(Mat &inputImage, Mat& outputImage, int div)
{
    //参数准备
    outputImage = inputImage.clone();   //复制实参到临时变量
    int rowNumber = outputImage.rows; //行数
    int colNumber;
    if(outputImage.isContinuous()){
        colNumber = outputImage.total() * outputImage.elemSize(); //每一行元素的个数
        rowNumber = 1;
        uchar *data = outputImage.ptr<uchar>(0);  //获取第i行的首地址
        for(int i = 0; i < colNumber; ++i){
            data[i] = data[i]/div*div + div/2;
        }

    }
}
/*   0.242588    */
void colorReduceSTL(Mat &inputImage, Mat& outputImage, int div)//迭代器方式
{
    outputImage = inputImage.clone();   //复制实参到临时变量
    Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();
    Mat_<Vec3b>::iterator itEnd = outputImage.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;
    }
}
//At方式每每只用于随机分为某个位置上的像素值
void colorReduceAt(Mat& inputImage, Mat& outputImage, int div)
{
    outputImage = inputImage.clone();
    int rows = outputImage.rows;
    int cols = outputImage.cols;
    for(int i = 0;i < rows;i++)
    {
        for(int j = 0;j < cols;j++)
        {
            outputImage.at<Vec3b>(i,j)[0] =  outputImage.at<Vec3b>(i,j)[0]/div*div + div/2;
            outputImage.at<Vec3b>(i,j)[1] =  outputImage.at<Vec3b>(i,j)[1]/div*div + div/2;
            outputImage.at<Vec3b>(i,j)[2] =  outputImage.at<Vec3b>(i,j)[2]/div*div + div/2;
        }
    }
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Mat srcImage = imread("F:\\MyCode\\dcq.jpg");
    imshow("srcImage", srcImage);

    //按照原始图的参数规格来建立效果图
    Mat dstImage ;
    dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());

    //记录起始时间
    double time0 = static_cast<double>(getTickCount());

    //调用颜色空间缩减函数
    colorReduceAt(srcImage, dstImage, 64);

    time0 = ((double)getTickCount() - time0) / getTickFrequency();
    cout << "time: " << time0 << "[s]" << endl;  //消耗的时间

     imshow("dstImage", dstImage);
    return a.exec();
}

相关文章
相关标签/搜索