Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Hrundel от Май 10, 2013, 19:56



Название: [РЕШЕНО] Фильтр desaturate
Отправлено: Hrundel от Май 10, 2013, 19:56
Всем привет!

Пытаюсь написать качественный desaturate но пока получается нечто ужасное. Понимаю, что считаю не так. Третий день перелапачиваю интернет, но ничего найти не могу. Посему прошу о помощи.

В коде выглядит так:

Код:
void ImageFilter::grauwert()
{
    imageSignalArray = data->getImageData();

    int width = data->getImageWidth();
    int height = data->getImageHeight();

    int r,g,b, mono;

    for (int i = 0; i < height * width; i++) {
        r = imageSignalArray[i].rgbRed;
        g = imageSignalArray[i].rgbGreen;
        b = imageSignalArray[i].rgbBlue;

        mono = (int)((float) r * 0.2126 + (float)g * 0.7152 + (float)b * 0.0722);

        imageSignalArray[i].rgbRed = mono;
        imageSignalArray[i].rgbGreen = mono;
        imageSignalArray[i].rgbBlue = mono;
    }

    data->setStreamData(imageSignalArray);
}

И вот что из этого получается:

(http://i47.fastpic.ru/big/2013/0510/6e/be67042ed0ad8ec96c34a965c508f36e.jpg)

А должно выглядеть так:

(http://i48.fastpic.ru/big/2013/0510/ac/e17cb558af08cc16b3d32856879d44ac.jpg)

Всем заранее спасибо за ответы!


Название: Re: Фильтр desaturate
Отправлено: Fat-Zer от Май 10, 2013, 21:48
получившееся значения яркости могут выходить за 255... поэтому вместо белого цвета получаешь мусор...
надо как-то так подкрутить:
Код:
mono = mono>255 ? 255 : mono;

ЗЫ: честно говоря, не очень знаю, но, есть сомнения по поводу цифр....
если результат не удовлетворит попробуй:  0.299 * R + 0.587 * G + 0.114 * B;

[added]
по поводу 255-ти я осчитался... не смотри на это..


Название: Re: Фильтр desaturate
Отправлено: Hrundel от Май 10, 2013, 22:10
Да пробовал уже и с
Код:
mono = mono>255 ? 255 : mono;
и с другими значениями, и
Код:
(max(r,g,b) - min(r,g,b))/2
и
Код:
(r+g+b)/3
ничего не дает ожидаемого результата и все варианты режут цвет.


Название: Re: Фильтр desaturate
Отправлено: Hrundel от Май 11, 2013, 01:38
Нащел замечательный вариант. Теперь все работает!

Код:
void ImageFilter::grauwert()
{
    imageSignalArray = data->getImageData();

    int width = data->getImageWidth();
    int height = data->getImageHeight();

    int r,g,b, mono;

    QColor temp;

    for (int i = 0; i < height * width; i++) {
        r = (int)imageSignalArray[i].rgbRed;
        g = (int)imageSignalArray[i].rgbGreen;
        b = (int)imageSignalArray[i].rgbBlue;

        temp.setRed(r);
        temp.setGreen(g);
        temp.setBlue(b);

        mono = temp.lightness();

        imageSignalArray[i].rgbRed = mono;
        imageSignalArray[i].rgbGreen = mono;
        imageSignalArray[i].rgbBlue = mono;
    }

    data->setStreamData(imageSignalArray);
}


Название: Re: [РЕШЕНО] Фильтр desaturate
Отправлено: Fat-Zer от Май 11, 2013, 13:02
там (max + min) / 2;