【问题标题】:Get puzzled on histogram equalization in Qt对 Qt 中的直方图均衡感到困惑
【发布时间】:2011-11-24 13:54:02
【问题描述】:

我是图像处理新手。尝试直方图均衡算法时,出现了一个无法解释的错误,如下图所示。

很抱歉,我现在无法上传图片。我将改用 picasa。 https://picasaweb.google.com/lh/photo/xoxhWR7waVp50uLh-Ko78C_rLSYVGhhn6l5Yer6Tngc?feat=directlink

原图在左边。

我的算法是把RGB转成YCbCr对Y进行均衡,把Cb和Cr都留着,然后再把YCbCr转成RGB,再把均衡后的图片显示出来。

这是转换代码。

void MainWindow::rGBToYCbCr(uchar *bmpArray,uchar *lumaArray,uchar *cBCrArray,int startPoint)
{
    for(int i = 0,m = 0,n = 0; i < bmpWidth * bmpHeight; i++,m+=3,n+=2)
    {
        lumaArray[i] = (uchar)(0.299 * bmpArray[startPoint + m + 2] + 0.587 *bmpArray[startPoint + m + 1] + 0.115 * bmpArray[startPoint + m]);
        cBCrArray[n] = (uchar)(-0.169 * bmpArray[startPoint + m + 2] - 0.331 * bmpArray[startPoint + m + 1] + 0.5 * bmpArray[startPoint + m]) + 128;//cb
        cBCrArray[n+1] = (uchar)(0.5 * bmpArray[startPoint + m + 2] - 0.419 * bmpArray[startPoint + m + 1] - 0.081 * bmpArray[startPoint + m]) + 128;//cr
    }
}

void MainWindow::yCbCrToRGB(uchar *lumaArray,uchar *targetArray,uchar *CbCrArray,int startPoint)
{
    for(int i = 0,m = 0,n=0; i < 3 * bmpWidth * bmpHeight; i+=3,m++,n+=2)
    {
        targetArray[startPoint + i + 2] = lumaArray[m] + (uchar)(1.402 * (CbCrArray[n + 1] - 128));
        targetArray[startPoint + i + 1] = lumaArray[m] - (uchar)(0.344 * (CbCrArray[n] - 128)) - (uchar)(0.714 * (CbCrArray[n + 1] - 128));
        targetArray[startPoint + i] = lumaArray[m] + (uchar)(1.772 * (CbCrArray[n] - 128));
    }
}

这是均衡算法。

void MainWindow::histogramEqulizeGrayScale(uchar *bmpArray,int startPoint)
{
    int hisTimes[256]={0};
    for(int i = 0; i < bmpWidth * bmpHeight; i++)
        hisTimes[(int)bmpArray[startPoint + i]]++;
    double pixmapProbability[256];
    for(int i = 0; i < 256; i++)
    {
        int sum = 0;
        for(int j = 0; j <= i; j++)
            sum += hisTimes[j];
        pixmapProbability[i] = (double)sum / (double)(bmpWidth * bmpHeight);
    }
    for(int i = 0; i < 256; i++)
        hisTimes[i] = pixmapProbability[i] * 256;
    for(int i = 0; i < bmpWidth * bmpHeight; i++)
        bmpArray[startPoint + i] = hisTimes[bmpArray[startPoint + i]];
}

为什么颜色会变得这么难看?

【问题讨论】:

    标签: image-processing histogram


    【解决方案1】:

    会不会是你的颜色值溢出了?

    您必须将每种颜色的计算结果限制为 [0,255]

    【讨论】:

    • 感谢您的回答。您的意思是从 YCbCr 转换时 RGB 颜色值溢出吗?我记得Qt会将颜色值固定为[0,255]。如果值溢出,QPainter应该输出一些东西,不是吗?但我没有收到任何信息。
    • :终于,我明白了溢出的真正含义!我将颜色值数据存储在一个 unsigned char 变量中,结果溢出了!
    • @user957121:你认为这意味着什么 :) 那么它对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多