Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 7

Увеличить контрастность полутоновых изображений

24.05.2015, 16:19. Показов 1844. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна помощь по вот такому вопросу. Мне дали курсовую, задание курсовой в которой нужно разработать програму, которая будет увеличивать контрастность полутоновых изображений. Проблема в том, что я-то написал все, но в результате я получаю черную картинку, в которой предельно редко проскакивают белые пиксели.

Суть в чем: я создаю динамические масивы(два массива), записываю в один массив значения с входного файла(т.к. изображение полутоновое, массив интов один), получаю минимальное и максимальное значение на всей картинке, за формулой int((значение текущего пикселя - минимал.)/(макс. - миним.)*255) увеличиваем разницу значений пикселей - увеличиваем контраст, кидаем новые значения на картинку.

Но вот проблема! Значения текущего пикселя берется нормально(проверял), а результат функции в 99.999% = 0. Прошу посмотреть код программы, может кто найдет какую ошибку:

Код самой кнопки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  
   unsigned r, g, b;
   int min, max;
   TColor Color;
   //Объявление динамических массивов 
   int **inp_image = new int *[Image1->Width];
   int **out_image = new int *[Image1->Width];
   for (int i=0; i<Image1->Width; i++)
   {  inp_image[i] = new int [Image1->Height];
      out_image[i] = new int [Image1->Height];  }
   //Записываем в один из них значения пикселей с картинки
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   {  COLORREF Color=ColorToRGB(Image1->Canvas->Pixels[x][y]);
      r=GetRValue(Color); g=GetGValue(Color); b=GetBValue(Color);
   inp_image[x][y]=floor((r+g+b)/3);  }
   //Ищем минимум и максимум
   min=inp_image[0][0]; max=inp_image[0][0];
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   { if (inp_image[x][y]>max) max=inp_image[x][y];
     if (inp_image[x][y]<min) min=inp_image[x][y]; }
   //"Растягиваем" значения
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   { out_image[x][y]=int((inp_image[x][y]-min)/(max-min)*255);  }
   //Рисуем результат функции на картинке
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   {  Image1->Canvas->Pixels[x][y]=(TColor)RGB(out_image[x][y],out_image[x][y],out_image[x][y]); }
   //Удаляем динамический массив
   for (int i=0;i<Image1->Width; i++)
   {  delete []inp_image[i];  delete []out_image[i];  }
      delete []inp_image; inp_image=NULL;
      delete []out_image; out_image=NULL;
Буду очень благодарен, если кто скажет, что не так, и как исправить. Спасибо за потраченное время!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2015, 16:19
Ответы с готовыми решениями:

Контрастность монитора
Всем привет. Недавно появилась повышенная контрастность. К примеру в играх где падает тень или просто затенённые объекты слишком темно,...

Qt контрастность изображения
Кто может подсказать, как можно изменить контрастность изображения? нужно открыть доступ к пикселям и через RGB? или как?

Контрастность в TImage
Всем добра. Подскажите пожалуйста как в среде программирования Delphi,загруженную картинку в TImage регулировать контрастность с помощью...

4
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.05.2015, 17:05
  1. Абсолютно нечитаемый код
  2. Деление у вас целое? Ну, и...
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 7
24.05.2015, 17:10  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
1. Абсолютно нечитаемый код
2. Деление у вас целое? Ну, и...
1. Почему же "нечитаемый"? По-моему все проще простого. Да и работает этот килограмм символов! Только не так, как хотелось.
2. Т.е., если я объявлю мину, максу и прочих как float, а в конце при записи интую, то все должно быть норм?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.05.2015, 17:23
Цитата Сообщение от Anagan Посмотреть сообщение
Почему же "нечитаемый"?
Найдите какой-нибудь "C coding style guidelines". И научитесь правильно разговаривать. Без "интую".
Тогда продолжим.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 7
24.05.2015, 19:00  [ТС]
Найдите какой-нибудь "C coding style guidelines". И научитесь правильно разговаривать. Без "интую".
Тогда продолжим.
-.- Спасибо за предоставленную помощь.

Добавлено через 1 час 27 минут
Спасибо за совет №2. Действительно, поменял интовое значение на действительное и все заработало так, как надо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
   unsigned r, g, b;
 ->float min, max;
   TColor Color;
   //-Оголошуєм-динамічний-масив--------------------
   int **inp_image = new int *[Image1->Width];
   int **out_image = new int *[Image1->Width];
   for (int i=0; i<Image1->Width; i++)
   {  inp_image[i] = new int [Image1->Height];
      out_image[i] = new int [Image1->Height];  }
   //-Заповнюєм-змінні-значеннями-тону--------------
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   {  COLORREF Color=ColorToRGB(Image1->Canvas->Pixels[x][y]);
      r=GetRValue(Color);
   inp_image[x][y]=r;  }
   //-Визначення-оперативного-діапазону-------------
   min=inp_image[0][0]; max=inp_image[0][0];
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   { if (inp_image[x][y]>max) max=inp_image[x][y];
     if (inp_image[x][y]<min) min=inp_image[x][y]; }
   //-Підвищення-контрасту-зображення---------------
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   { out_image[x][y]=int((inp_image[x][y]-min)/(max-min)*255);  }
   //-Виведення-вихідного-зображення----------------
   for (int x=0; x<=Image1->Width-1; x++)
   for (int y=0; y<=Image1->Height-1; y++)
   {  Image1->Canvas->Pixels[x][y]=(TColor)RGB(out_image[x][y],out_image[x][y],out_image[x][y]); }
   //-Видалення-динамічних-массивів-----------------
   for (int i=0;i<Image1->Width; i++)
   {  delete []inp_image[i];  delete []out_image[i];  }
      delete []inp_image; inp_image=NULL;
      delete []out_image; out_image=NULL;
Иногда ответ ближе, чем кажется)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.05.2015, 19:00
Помогаю со студенческими работами здесь

Динамическая контрастность
50000:1 - это возможно или просто рекламный трюк? Так написано на только что купленном мониторе &quot;Самсунг&quot;. Есть ли толк от этой...

контрастность дисплея
Здорова, ребят! Столкнулся на днях вот с какой проблемой. У меня (асус к55д вин7 д64 радеон дуал графикс хд 7520г+7470м 1гб). Так вот,...

Контрастность ЖКИ WHxxyy
Всем привет! Доводилось видеть в роли регулятора контрастности &lt;ul&gt;Подстроечник-делитель Опорник из цепочки прямосмещённых...

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

Контрастность через trackbar
Есть trackbar b picherbox как сделать что бы можно было через trackbar Изменять контраст на picherbox


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru