Arr
,分别表示每列(1x500)中的白色像素数量。const int Width = img.cols;
int* Arr = new int[Width];
for( int x = 0; x < Width; x++ ) {
Arr[x] = 0;
for( int y = 0; y < img.rows; y++ ) {
if ( img.at<cv::Vec3b>(y,x) == cv::Vec3b(255,255,255) ) {
Arr[x]++;
}
}
}
// minimum range width is guaranteed to be less or equal to (Width/2 + 1)
int bestA = 0, minimumWidth = Width/2 + 1;
int total = RangeSum(Arr, 0, Width-1);
for (int i = 0; i < Width; i++) {
for (int j = i; j < Width && j < i + minimumWidth; j++) {
int rangeSum = RangeSum(Arr, i, j);
if (rangeSum > total - rangeSum) {
bestA = i;
minimumWidth = j - i + 1;
break;
}
}
}
std::cout << "Most white minimum range - [" << bestA << ";" << bestA + minimumWidth - 1 << "]\n";
如果您预先计算所有[0; i]范围的总和,其中i从0到Width-1,则可以优化代码。然后,您可以将RangeSum(Arr, A, B)
计算为PrecalculatedSums[B] - PrecalculatedSums[A]
(在O(1)复杂度下)。
Arr
时,我设置了一个与img.rows
相关的置信区间,以确定哪个像素范围落入该区间。感谢您的回答。 - Erdem Tuna