测试图像2560×1920,blocksize = 10;10张图片取平均。
方法一
将每个方块赋给一个新的图像,思路简单,在十二线扫描法中使用。平均耗时240ms
int H2 = Imgs.rows/SampleScale; //image height
int W2 = Imgs.cols/SampleScale; //image width
time_t tic_s,tic,toc;
tic_s = clock();
Mat ImgSample;
ImgSample.create(H2,W2,CV_8UC1);
Mat Iblock = Mat(SampleScale,SampleScale,CV_8UC1);
for(int i=0;i<W2;i++)
{
for(int j=0;j<H2;j++)
{
Rect rect(i*SampleScale,j*SampleScale,SampleScale,SampleScale);
Imgs(rect).copyTo(Iblock);
double minval,maxval;
minMaxLoc(Iblock,&minval,&maxval);
*(ImgSample.data+j*W2+i) = maxval-minval;
//ImgSample.at<uchar>(j,i) = maxval-minval;
}
方法二
省略掉复制一步,平均耗时211ms
方法三
平均耗时145ms
for(int x = 0;x < M2;x++)
{
uchar* pImgSample = ImgSample.ptr<uchar>(x);
for(int y = 0;y < N2;y++)
{
double maxval,minval;
minMaxLoc(Imgs(cv::Rect(SampleScale*y,SampleScale*x,SampleScale,SampleScale)),&minval,&maxval);
pImgSample[y] = maxval - minval;
}
}
分析:
方法三将指针计算放到了第二重for循环外面,减少了计算量。