訪問影象畫素幾種方法
阿新 • • 發佈:2018-11-26
#include <iostream> #include <opencv2/opencv.hpp> #include <Windows.h> #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 = 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; } } } /* -----迭代器訪問------------ 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)[0] = (*it)[0] / div * div + div / 2; (*it)[1] = (*it)[1] / div * div + div / 2; (*it)[2] = (*it)[2] / div * div + div / 2; } } */ /* -------用指標訪問元素---------- void colorReduce(Mat &inputImage, Mat &outputImage, int div) { outputImage = inputImage.clone(); int rowNumber = outputImage.rows; int colNumber = outputImage.cols*outputImage.channels(); 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; } } } */ int main(int argc,char *argv[],char **env) { Mat srcImage = imread("1.jpg"); Mat dstImage; dstImage.create(srcImage.rows, srcImage.cols, srcImage.type()); double time0 = static_cast<double> (getTickCount()); colorReduce(srcImage, dstImage, 32); time0 = ((double)getTickCount() - time0) / getTickFrequency(); cout << time0 << endl; imshow("1", dstImage); waitKey(0); return 0; }