由于有一个项目需要对图像逐个像素进行操作,本身对运行效率要求比较高,所以我设计了比较指针遍历和库函数运行效率比较的程序,来观察那种方法更合适。
要计时,需要包含头文件< ctime>
cv::Mat src_matrix = cv::imread("1.bmp"); // 原图像,350×338
cv::Mat _pretreated_matrix;
pretreat(src_matrix);
使用OpenCV自带函数访问像素
void pretreat(const cv::Mat &src_matrix)
{
src_matrix.convertTo(_pretreated_matrix, CV_64FC1);
double _mean = 0, *pixel;
clock_t t1 = clock();
// 计算平均值
_pretreated_matrix /= 255; // 每个像素都除了255
_mean = cv::mean(_pretreated_matrix)[0]; // 获得全部像素的平均值
// 逐像素减去平均值
_pretreated_matrix -= _mean; // 全部像素逐一减去平均值
clock_t t2 = clock();
std::cout << "总用时:" << ((double)(t2 - t1) / CLOCKS_PER_SEC) << "秒" << std::endl;
}
运行时间:
使用指针的方法访问像素
void pretreat(const cv::Mat &src_matrix)
{
src_matrix.convertTo(_pretreated_matrix, CV_64FC1);
double _mean = 0, *pixel;
clock_t t1 = clock();
// 计算平均值
for (int i = 0; i < _pretreated_matrix.rows; i++)
{
pixel = _pretreated_matrix.ptr<double>(i);
for (int j = 0; j < _pretreated_matrix.cols; j++, pixel++)
{
*pixel /= 255;
_mean += *pixel;
}
}
_mean = _mean / (_pretreated_matrix.rows * _pretreated_matrix.cols);
// 逐像素减去平均值
for (int i = 0; i < _pretreated_matrix.rows; i++)
{
pixel = _pretreated_matrix.ptr<double>(i);
for (int j = 0; j < _pretreated_matrix.cols; j++, pixel++)
*pixel -= _mean;
}
clock_t t2 = clock();
std::cout << "总用时:" << ((double)(t2 - t1) / CLOCKS_PER_SEC) << "秒" << std::endl;
}
运行时间
综上,使用指针访问像素的效率更高。