Как определить интенсивность пикселей относительно диапазона пикселей по оси X? - PullRequest
3 голосов
/ 30 марта 2019

Я хочу увидеть распределение цвета по ширине изображения. То есть, если (черно-белое) изображение имеет ширину 720 пикселей, я хочу заключить, что определенный диапазон (например, пикселей [500,720]) имеет больше белого цвета по сравнению с остальной частью изображения. Я подумал, что мне нужен фрагмент изображения 720x1 px, а затем мне нужно проверить значения и распределить их по w.r.t. ширина 720 пикселей. Но я не знаю, как я могу применить это подходящим способом?

edit: я использую OpenCV 4.0.0 с C ++.

Пример: на первом изображении очевидно, что правые пиксели белого цвета. Я хочу получить оценку координат этой плотной линии или зоны. Меня интересует светло-розовая зона, а красные границы - это область, где я хочу ее найти.

enter image description here enter image description here

1 Ответ

1 голос
/ 30 марта 2019

Если вы хотите получить минимальный непрерывный диапазон столбцов изображения, которые содержат больше белого, чем остальная часть изображения, чем сначала вам нужно рассчитать количество белых пикселей в каждом столбце.Предположим, у нас есть изображение 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)).

...