OpenCV之遍历像素,减少图像颜色[模糊],测试运行时间
时间: 2018-08-31来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>> #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(); }

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行