Отображение пикселей / элементов в процентили (C ++ / OpenCV) - PullRequest
0 голосов
/ 27 июня 2018

Я использую OpenCV, и у меня есть следующая проблема, которую я хочу решить на изображении. Однако мой вопрос не обязательно должен быть ограничен OpenCV, если это проблема, он может быть просто более общим c ++, скажем, на векторах.

Проблема

Я хочу отобразить значения пикселей входного изображения (или элементов входного вектора) в выходное изображение (или вектор) того же размера. Каждый элемент вывода должен содержать процентиль * соответствующего элемента на входе.

Мой вопрос

Как бы я кодировал реализацию этой проблемы? (В C ++ или OpenCV)

Пример

Я приведу пример одномерного изображения, просто для простоты.

Входной сигнал: (1, 2, 10, 3, 4, 5, 6, 12, 7)

Вывод *: (0.11, 0.22, 0.89, 0.33, 0.44, 0.56, 0.67, 1.00, 0.78)

Производительность?

Я пишу код для анализа изображений, который может быть от нескольких сотен до нескольких сотен. Я предполагаю, что моя проблема возможна в O (n log n), но я не думаю, что даже O (n ^ 2) будет проблемой (где n - общее количество элементов в изображении / векторе). Однако, если точные процентили вызывают слишком много проблем со сложностью, у меня все в порядке с определенным количеством бинов вместо этого.


(*) Я знаю, что есть несколько разных способов осмысления процентили, будь то округление вверх или вниз и так далее. Это не важно для меня. Каким бы образом ни работал.

1 Ответ

0 голосов
/ 27 июня 2018

Я не уверен, что это то, что вы ищете, но это наивная реализация процентиля для значений пикселей изображения.

    cv::Mat image = cv::imread("image.jpg",cv::IMREAD_UNCHANGED);

    // convert image to gray
    cv::Mat gray;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

    // calculate histogram for every pixel value (i.e [0 - 255])
    cv::Mat hist;
    int histSize = 256;
    float range[] = { 0, 256 } ;
    const float* histRange = { range };
    bool uniform = true; bool accumulate = false;
    cv::calcHist( &gray, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate );

    // total pixels in image
    float totalPixels = gray.cols * gray.rows;

    // calculate percentage of every histogram bin (i.e: pixel value [0 - 255])
    // the 'bins' variable holds pairs of (int pixelValue, float percentage) 
    std::vector<std::pair<int, float>> bins;
    float percentage;
    for(int i = 0; i < 256; ++i)
    {
        percentage = (hist.at<float>(i,0)*100.0)/totalPixels;
        bins.push_back(std::make_pair(i, percentage));
    }

    // sort the bins according to percentage
    sort(bins.begin(), bins.end(),comparator());

    // compute percentile for a pixel value
    int pixel = 185;
    float sum = 0;

    for (auto b : bins)
    {
        if(b.first != pixel)
            sum += b.second;
        else
        {
            sum += b.second/2;
            break;
        }
    }

    std::cout<<"Percentile for pixel("<<pixel<<"): "<<sum<<std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...