Озадачитесь выравниванием гистограммы в Qt - PullRequest
1 голос
/ 24 ноября 2011

Я новичок в обработке изображений. Когда я попробовал алгоритм выравнивания гистограммы, я получил ошибку, которую не могу объяснить, как показано на рисунке ниже.

Извините, что могуне загружаю изображение прямо сейчас. Вместо этого я буду использовать Picasa.https://picasaweb.google.com/lh/photo/xoxhWR7waVp50uLh-Ko78C_rLSYVGhhn6l5Yer6Tngc?feat=directlink

Исходное изображение слева.

Мой алгоритм состоит в том, чтобы превратить RGB в YCbCr и выровнять Y, оставить Cb и Cr be. Затем снова конвертируйте 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]];
}

Почему цвет стал бы таким ужасным?

1 Ответ

1 голос
/ 24 ноября 2011

Может ли быть так, что значения вашего цвета переполнены?

Вы должны ограничить результаты своих расчетов для каждого цвета до [0,255]

...