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

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

24.05.2015, 16:19. Показов 1860. Ответов 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
3177 / 1936 / 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
3177 / 1936 / 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
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru