Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ Цветокоррекция "Серый мир"

Роман Protocol Мыслитель (8562), на голосовании 6 лет назад
Всем привет!
Настроил SFML. Каму интересно инструкция по настройке здесь https://www.youtube.com/watch?v=1KXOL7-XfMk
Реализовал в коде алгоритм преобразования изображений "Серый мир".
Вот результаты работы алгоритма (с цифрой 5 - это результат) https://yadi.sk/d/woOhASrq3SVKFD
Почему некоторые изображения портятся, а на некоторых алгоритм верно срабатывает?
Что поправить в коде и как?
Спасибо за ответы!

#include < SFML/Graphics.hpp > //Для работы с изображением, только при установленной библиотеке SFML
#include < iostream >
#include < iomanip >

using namespace sf; //Область имён для работы сущностей SFML
using namespace std;

int main()
{
setlocale(LC_ALL, "rus");
Image heroimage; //Создание единичного экземпляра стороннего класса Image
heroimage.loadFromFile("Images/Лепески. jpg"); //Чтение изображения в экземпляр класса
//Папку Image располагать рядом с Sourse.cpp текущего проекта
cout << heroimage.getSize().x << endl; //Выводим в консоль размер изображения ширина
cout << heroimage.getSize().y << endl; //Выводим в консоль размер изображения высота
int rr = 0;
int gg = 0;
int bb = 0;
for (unsigned u = 0; u < heroimage.getSize().x; ++u) //Листаем пикселы в копии изображения в экземпляре heroimage
{
for (unsigned p = 0; p < heroimage.getSize().y; ++p)
{
Color cl = heroimage.getPixel(u, p); //Считывание цвета для пиксела с заданными координатами
rr += cl.r;
gg += cl.g;
bb += cl.b;
}
}
double avg = (rr + gg + bb) / 3.0;
for (unsigned u = 0; u < heroimage.getSize().x; ++u) //Листаем пикселы в копии изображения в экземпляре heroimage
{
for (unsigned p = 0; p < heroimage.getSize().y; ++p)
{
Color cl = heroimage.getPixel(u, p);
Color ct(cl.r * (double)(avg / rr) > 255? 255 : cl.r * (double)(avg / rr),
cl.g * (double)(avg / gg) > 255? 255 : cl.g * (double)(avg / gg),
cl.b * (double)(avg / bb) > 255? 255 : cl.b * (double)(avg / bb)
);
heroimage.setPixel(u, p, ct);
}
}
heroimage.saveToFile("Images/Лепески5.jpg"); //Сохранение преобразованного изображения, создание нового файла
cout << "Готово" << endl;

cin.get(); cin.get();
}
Дополнен 6 лет назад
А может сумма в int не влазит?
Дополнен 6 лет назад
Точно. Поставил long long и нормально стало.
Голосование за лучший ответ
InviZzzible Мудрец (10825) 6 лет назад
Привет.
приведение (double)(avg / gg) не совсем корректно я думаю надо так :
cl.g * ((double)(avg) / gg)
по теме вопроса ничего не скажу.
Похожие вопросы