opencv calcHistLookupTables_8u
static void calcHistLookupTables_8u( const Mat& hist, const SparseMat& shist, int dims, const float** ranges, const double* uniranges, bool uniform, bool issparse, std::vector<size_t>& _tab ) { const int low = 0, high = 256; int i, j; _tab.resize((high-low)*dims); size_t* tab = &_tab[0]; if( uniform ) { for( i = 0; i < dims; i++ ) { double a = uniranges[i*2]; double b = uniranges[i*2+1]; int sz = !issparse ? hist.size[i] : shist.size(i); size_t step = !issparse ? hist.step[i] : 1; for( j = low; j < high; j++ ) { int idx = cvFloor(j*a + b); size_t written_idx; if( (unsigned)idx < (unsigned)sz ) written_idx = idx*step; else written_idx = OUT_OF_RANGE; tab[i*(high - low) + j - low] = written_idx; } } } else if (ranges) { for( i = 0; i < dims; i++ ) { int limit = std::min(cvCeil(ranges[i][0]), high); int idx = -1, sz = !issparse ? hist.size[i] : shist.size(i); size_t written_idx = OUT_OF_RANGE; size_t step = !issparse ? hist.step[i] : 1; for(j = low;;) { for( ; j < limit; j++ ) tab[i*(high - low) + j - low] = written_idx; if( (unsigned)(++idx) < (unsigned)sz ) { limit = std::min(cvCeil(ranges[i][idx+1]), high); written_idx = idx*step; } else { for( ; j < high; j++ ) tab[i*(high - low) + j - low] = OUT_OF_RANGE; break; } } } } else { CV_Error(Error::StsBadArg, "Either ranges, either uniform ranges should be provided"); } }
代码参考:opencv-3.4.1modulesimgprocsrchistogram.cpp
###############################################