gpt4 book ai didi

c++ - 将像素/元素映射到百分位数 (C++/OpenCV)

转载 作者:行者123 更新时间:2023-11-28 04:37:14 25 4
gpt4 key购买 nike

我正在使用 OpenCV,我有以下问题想在图像上解决。但是,如果它是一个问题,我的问题不必局限于 OpenCV,它可以只是更通用的 c++,比如 vector 。

问题

我想将输入图像(或输入 vector 的元素)的像素值映射到相同大小的输出图像(或 vector )中。输出的每个元素都应包含输入中相应元素的百分位数*。

我的问题是

How would I code an implementation of this problem? (In c++ or 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 是图像/vector 中元素的总数)。但是,如果精确的百分位数导致过多的复杂性问题,我可以接受一定数量的分箱。


(*) 我知道有几种不同的百分位数概念化方法,无论是向上舍入还是向下舍入等等。这对我来说并不重要。无论哪种方式都有效。

最佳答案

我不确定这是否是您要查找的内容,但这是图像像素值百分位数的天真实现。

    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;

关于c++ - 将像素/元素映射到百分位数 (C++/OpenCV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51063944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com