对 Qt 中的直方图均衡感到困惑

发布于 2024-12-17 20:18:47 字数 2327 浏览 1 评论 0原文

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

抱歉,我现在无法上传图片。我将使用 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]];
}

为什么颜色会变得这么可怕?

I'm new to image processing.When I tried the histogram equalization algorithm,I got an error which I can't explain,just as the picture shows below.

I'm sorry that I can't upload a picture right now.I'll use picasa instead.
https://picasaweb.google.com/lh/photo/xoxhWR7waVp50uLh-Ko78C_rLSYVGhhn6l5Yer6Tngc?feat=directlink

The original picture is on the left.

My algorithm is turn RGB into YCbCr and equalize Y,leave Cb and Cr be.Then convert YCbCr into RGB again to show the picture after equalization.

Here's the conversion code.

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));
    }
}

And here is the equlization algorithm.

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]];
}

Why would the color become so terrible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

2024-12-24 20:18:47

难道是你的颜值溢出了?

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

could it be that your color values are overflowing?

You have to clamp the results of your calculations for each color to [0,255]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文