我正在尝试使用openCV和C ++来均衡HSV图像的直方图。 我知道有openCV的库会为我做这个,但我想手动尝试来理解这个方法。
我假设均衡将在HSV图像的V通道上完成? 我找到了一种灰度直方图均衡的方法,包括
我在纸上尝试了这种方法,使用简单的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 ++很新,所以可能还有其他错误。 任何帮助表示赞赏。
答案 0 :(得分: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++)
...