簡體   English   中英

將像素/元素映射到百分位數(C ++ / OpenCV)

[英]Mapping pixels/elements to percentiles (C++/OpenCV)

我正在使用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是圖像/矢量中元素的總數)。 但是,如果精確的百分位數導致太多的復雜性問題,那么我可以使用一定數量的垃圾箱。


(*)我知道,無論是向上舍入還是向下舍入,都有幾種不同的概念化百分位數。 這對我來說並不重要。 無論采用哪種方式。

我不確定這不是您要查找的內容,但這是圖像像素值百分位數的幼稚實現。

    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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM