【问题标题】:Equalize histogram for HSV image均衡 HSV 图像的直方图
【发布时间】:2013-11-20 13:58:15
【问题描述】:

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

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

  • Count 每个值的像素数
  • 查找图像中每个像素的概率
  • 计算累积分布函数
  • 计算图像中的 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++ 相当陌生,所以很可能还有其他错误。 任何帮助表示赞赏。

【问题讨论】:

    标签: c++ opencv image-processing histogram


    【解决方案1】:

    您忘记将 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++)
    ...
    

    【讨论】:

    • 谢谢,这给了我更现实的价值观。现在的问题是概率都出现在 0。由 rows*cols = 234164 计算的像素总数。我将概率计算为:每个像素值的数量/总数。我还将其他数组初始化为 0。
    • 太棒了!完成查找表,结果看起来与 openCV 库方法相同,所以我猜这意味着它是正确的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多