Если вы хотите получить минимальный непрерывный диапазон столбцов изображения, которые содержат больше белого, чем остальная часть изображения, чем сначала вам нужно рассчитать количество белых пикселей в каждом столбце.Предположим, у нас есть изображение 720x500 (500 пикселей в высоту и 720 пикселей в ширину).Чем вы получите массив Arr
из 720 элементов, которые равны количеству белых пикселей в каждом столбце (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]++;
}
}
}
Вам необходимо найти минимальный диапазон [A; B] в этом массивекоторый удовлетворяет условию Sum (Arr [0 до A-1]) + Sum (Arr [B + 1 до Width-1])
// 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 до ширины - 1. Чем вы можете рассчитать RangeSum(Arr, A, B)
как PrecalculatedSums[B] - PrecalculatedSums[A]
(в сложности O (1)).