Russian Qt Forum
Октябрь 01, 2024, 10:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Фильтр desaturate  (Прочитано 2491 раз)
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);
}

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



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



Всем заранее спасибо за ответы!
« Последнее редактирование: Май 11, 2013, 01:38 от Hrundel » Записан
Fat-Zer
Гость
« Ответ #1 : Май 10, 2013, 21:48 »

получившееся значения яркости могут выходить за 255... поэтому вместо белого цвета получаешь мусор...
надо как-то так подкрутить:
Код:
mono = mono>255 ? 255 : mono;

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

[added]
по поводу 255-ти я осчитался... не смотри на это..
« Последнее редактирование: Май 10, 2013, 21:57 от Fat-Zer » Записан
Hrundel
Гость
« Ответ #2 : Май 10, 2013, 22:10 »

Да пробовал уже и с
Код:
mono = mono>255 ? 255 : mono;
и с другими значениями, и
Код:
(max(r,g,b) - min(r,g,b))/2
и
Код:
(r+g+b)/3
ничего не дает ожидаемого результата и все варианты режут цвет.
Записан
Hrundel
Гость
« Ответ #3 : Май 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);
}
Записан
Fat-Zer
Гость
« Ответ #4 : Май 11, 2013, 13:02 »

там (max + min) / 2;
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 21.