1,图像储存方式
2,颜色缩减
3,查表 look up table
4,计时函数
实例 颜色空间缩减如256*256→26*26(访问每个像素)
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void colorReduce(Mat& inputImage, Mat& outputImage, int div);//全局函数说明
int main()
{
Mat scrimage = imread("D://Bild.jpg");//注意路径格式
imshow("原图", scrimage);
Mat dstimage;
dstimage.create(scrimage.rows, scrimage.cols, scrimage.type());//构造与原图,行数,列数,类型相同 Mat&inputImage,Mat&outputImage,int div
double time0 = static_cast<double>(getTickCount());//记录起始时钟周期数
colorReduce(scrimage, dstimage, 64);
time0 = ((double)getTickCount() - time0) / getTickFrequency();//过程时间=(终止时钟周期数-起始时钟周期数)/一秒钟走过的时钟周期数(频率)
cout << "此方法运行时间为:" << time0 << "秒" << endl;//输出
imshow("效果图", dstimage);
waitKey(0);
}
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
outputImage = inputImage.clone();//复制实参到临时变量
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols*outputImage.channels();//行数,列数(cols*通道数)
for (int i = 0; i < rowNumber; i++)//行循环
{
uchar* data = outputImage.ptr<uchar>(i);
for (int j = 0; j < colNumber; j++)
{
data[j] = data[j] / div * div + div / 2;
}
}
}
5,访问像素的三个方法
5.1,采用指针法(类似c语言,最快)
具体代码如上图所示,快是因为将三通道数据看成一样的(未划分开),依次操作,其他两种方法按通道类别来分别处理
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
outputImage = inputImage.clone();//复制实参到临时变量
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols*outputImage.channels();//行数,列数(cols*通道数)
for (int i = 0; i < rowNumber; i++)//行循环
{
uchar* data = outputImage.ptr<uchar>(i);
for (int j = 0; j < colNumber; j++)
{
data[j] = data[j] / div * div + div / 2;
}
}
}
5.2,STL迭代器法(待详细了解)
void colorReduce(Mat& inputImage, Mat& outputImage, int div)//采用STL迭代器方法
{
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;//对三个通道的每个像素都进行操作
}
}
5.3,动态地址(更直观,时间相对较长)
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
outputImage = inputImage.clone();//复制实参到临时变量
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols;//行数,列数
for (int i = 0; i < rowNumber; i++)//行循环
{
for (int j = 0; j < colNumber; 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;
}
}
}