[英]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.