2015-02-19 3 views
1

Я хочу сегментировать автомобильную пластину, чтобы получить отдельные символы. Я нашел статью, в которой такая сегментация выполняется с использованием гистограмм яркости (как я понимаю - сумма всех ненулевых пикселей).Как вычислить гистограмму яркости, агрегированную по столбцу в OpenCV C++

enter image description here

Как я могу вычислить такую ​​гистограмму? Я был бы очень признателен за любую помощь!

+3

это простой [сокращение()] (http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#reduce) (проекция изображения на ось x или y) – berak

+0

@berak Какой массив выходных данных вы должны были бы передать при использовании CV_REDUCE_SUM? – Antonio

+1

пустой Мат. 'Мат результат; уменьшить (ввод, результат, 1, CV_REDUCE_SUM, CV_32S); '(тип вывода должен быть больше CV_8U, если вы получили более 255 строк) – berak

ответ

1
std::vector<int> computeColumnHistogram(const cv::Mat& in) { 

    std::vector<int> histogram(in.cols,0); //Create a zeroed histogram of the necessary size 
    for (int y = 0; y < in.rows; y++) { 
    p_row = in.ptr(y); ///Get a pointer to the y-th row of the image 
    for (int x = 0; x < in.cols; x++) 
     histogram[x] += p_row[x]; ///Update histogram value for this image column 
    } 

    //Normalize if you want (you'll get the average value per column): 
    // for (int x = 0; x < in.cols; x++) 
    // histogram[x] /= in.rows; 

    return histogram; 

} 

Или использовать reduce как предложено Berak, либо позвонив

cv::reduce(in, out, 0, CV_REDUCE_AVG); 

или

cv::reduce(in, out, 0, CV_REDUCE_SUM, CV_32S); 

out является cv::Mat, и он будет иметь одну строку.

+0

Спасибо большое! Это то что мне нужно. –

Смежные вопросы