方法一:用指针访问像素
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void colorReduce(Mat &inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();//复制实参到临时变量
int rowNumber=outputImage.rows;//行数
int colNumber=outputImage.cols*outputImage.channels();//即每行元素个数=列数*通道数
for(int i=;i<rowNumber;i++) //行循环
{
uchar* data=outputImage.ptr<uchar>(i);//获取第i行的首地址
for(int j=;j<colNumber;j++)//列循环
{
data[j]=data[j]/div*div+div/;//处理每个像素
}
}
} int main()
{
Mat srcImage=imread("E://lena.jpg");
imshow("原始数据",srcImage);
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
double time0=static_cast<double>(getTickCount());
colorReduce(srcImage,dstImage,);//调用颜色空间缩减函数
time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
cout<<"此方法运行时间:"<<time0<<"秒"<<endl;
imshow("效果图",dstImage);
waitKey(); }
运行效果:
方法二:用迭代器iterator操作像素
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std; void colorReduce(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)[]=(*it)[]/div*div+div/;
(*it)[]=(*it)[]/div*div+div/;
(*it)[]=(*it)[]/div*div+div/;
}
}
int main()
{
Mat srcImage=imread("E://lena.jpg");
imshow("原始数据",srcImage);
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
double time0=static_cast<double>(getTickCount());
colorReduce(srcImage,dstImage,);//调用颜色空间缩减函数
time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
cout<<"此方法运行时间:"<<time0<<"秒"<<endl;
imshow("效果图",dstImage);
waitKey(); }
运行结果:
方法三:动态地址计算
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std; //方法三:动态地址计算
void colorReduce(Mat &inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();//复制实参到临时变量
int rowNumber=outputImage.rows;//行数
int colNumber=outputImage.cols;//列数
//存取彩色图像像素
for(int i=;i<rowNumber;i++)
{ for(int j=;j<colNumber;j++)
{
outputImage.at<Vec3b>(i,j)[]=outputImage.at<Vec3b>(i,j)[]/div*div+div/;//蓝色通道
outputImage.at<Vec3b>(i,j)[]=outputImage.at<Vec3b>(i,j)[]/div*div+div/;//绿色通道
outputImage.at<Vec3b>(i,j)[]=outputImage.at<Vec3b>(i,j)[]/div*div+div/;//红色通道
}
}
}
int main()
{
Mat srcImage=imread("E://lena.jpg");
imshow("原始数据",srcImage);
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同
double time0=static_cast<double>(getTickCount());
colorReduce(srcImage,dstImage,);//调用颜色空间缩减函数
time0=((double)getTickCount()-time0)/getTickFrequency();//计算运行时间
cout<<"此方法运行时间:"<<time0<<"秒"<<endl;
imshow("效果图",dstImage);
waitKey(); }