gpt4 book ai didi

c++ - 均衡 HSV 图像的直方图

转载 作者:行者123 更新时间:2023-11-28 00:38:47 29 4
gpt4 key购买 nike

我正在尝试使用 openCV 和 C++ 来均衡 HSV 图像的直方图。我知道有些带有 openCV 的库可以为我执行此操作,但我想手动尝试以了解该方法。

我假设均衡将在 HSV 图像的 V channel 上完成?我找到了一种灰度直方图均衡化方法,它涉及

  • 统计每个值的像素数
  • 找出图像中每个像素的概率
  • 计算累积分布函数
  • 计算 CDF * 图像中的最大值。
  • 四舍五入得到像素值

我已经在纸上用一个简单的 5x5 值网格尝试了这种方法,它似乎给出了使值相等的效果。

我已尝试在 C++ 中实现此功能,但未获得预期的值。

int rows = channel.rows;
int cols = channel.cols;
int hist[256];
int total = rows*cols;
for(int i = 0; i<rows; i++)
{
for(int k = 0; k<cols; k++ )
{
int value = channel.at<cv::Vec3b>(i,k)[0];
hist[value] = hist[value] + 1;
}
}

double prob[255];
int newValues[255];
double cuml = 0;
for(int j = 0; j< 255; j++)
{
prob[j] = hist[j]/total; // Probability of each value in image
cuml = cuml + prob[j]; // Cumulative probability of current and all previous values
double cdfmax = cuml * 255; // Cumulative probability * max value
newValues[j] = (int) round(cdfmax);
cout << hist[j] << endl;
cout << prob[j] << endl;
}

Channel 是一个 Mat 图像,表示我的 HSV 图像的 V 值。我很确定问题在于第一个 for 循环来总结图像中该值的所有出现。我是 C++ 的新手,所以也可能存在其他错误。任何帮助表示赞赏。

最佳答案

例如,您忘记将 hist 数组初始化为零:

int hist[256] = {0};

更新:

prob[j] = hist[j]/total; 将始终得到 0,因为您正在进行整数除法(两项均为 int-s)。要避免这种情况,请执行 prob[j] = hist[j]/(double)total;

代码的第二部分仅使用直方图的 255 个值(但它有 256 个 bin)。所以将其更新为 256,如下所示:

double prob[256];
int newValues[256];
double cuml = 0;
for(int j = 0; j< 256; j++)
...

关于c++ - 均衡 HSV 图像的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861076/

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