首页 文章

均衡HSV图像的直方图

提问于
浏览
0

我试图使用openCV和C来均衡HSV图像的直方图 . 我知道有openCV的库会为我做这个,但我想手动尝试来理解这个方法 .

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

  • Count每个值的像素数

  • 查找图像中每个像素的概率

  • 计算累积分布函数

  • 计算图像中的CDF * Max值 .

  • 舍入此数字以获取像素值

我已经在纸上尝试了这种方法,使用简单的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;
}

通道是表示我的HSV图像的V值的Mat图像 . 我很确定问题出在第一个for循环中,以总结图像中所有出现的值 . 我对C很新,所以也可能有其他错误 . 任何帮助赞赏 .

1 回答

  • 3

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

相关问题