我正在尝试使用 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++ 相当陌生,所以很可能还有其他错误。任何帮助表示赞赏。