#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();
}
转载于:https://my.oschina.net/u/3919756/blog/1939621