3.6 Фильтр “Яркость/Контраст”

Изменение яркости заключается в изменении интенсивности цвета всех пикселов на заданное значение. Данное преобразование является точечным. Для его реализации добавим в программу класс CBrightCont, производный от класса CDotFilter. Интерфейс класса приведён в листинге 3.6.1

Листинг 3.6.1 – Интерфейс класса CBrightCont. Файл Filter.h

// Яркость/контраст

class CBrightCont: public CDotFilter

{

public:

BOOL Init(int b_offset, int c_offset);

};

Переменные b_offset, c_offset – это объекты, связанные с ползунками, могут принимать положительные и отрицательные значения, что соответствует увеличению или уменьшению яркости/контрастности изображения.

Реализация метода CBrightCont::Init() приведена в листинге 3.6.2 Этот метод инициализирует таблицы преобразования. Сначала выполняется смещение яркости на заданную величину, а затем либо "сжатие", либо "растяжение" диапазона яркости. Причем при сжатии значения яркости изменяются не равномерно, а пропорционально их удаленности от "серой середины", определенной константой CONTRAST_MEDIAN. После преобразования яркости работа по коррекции контрастности происходит со значениями таблицы преобразования, полагая при этом, что они являются индексами в таблице, полученной после коррекции яркости.

Листинг 3.6.2 – Метод CBrightCont::Init().Файл Filter.cpp

// "Серая середина" –уровень 159

#define CONTRAST_MEDIAN 159

BOOL CBrightCont::Init(int b_offset, int c_offset)

{int i=0,//Индекс цвета в таблице преобразований

t=0,//Индекс таблицы

//Индекс цвета, соответствующего нижней границе яркости

t_index=0,

// Индекс цвета, соответствующего верхней границе яркости

b_index=0,

value_offset; //Смещение значения цвета

double value=0.; //Новое значение цвета

//Изменяем яркость

for(i, t=0; t<3; t++)

for(i=0; i<256; i++)

{if(i+b_offset>255) BGRTransTable[t][i]=255;

else if(i+b_offset<0) BGRTransTable[t][i]=0;

else BGRTransTable[t][i]=i+b_offset; }

// Изменяем контрастность

if(c_offset<0)// Уменьшаем контрастность

{for(i=0, t=0; t<3; t++)

for(i=0; i<256; i++)

if(BGRTransTable[t][i]<CONTRAST_MEDIAN)

{

//Рассчитываем смещение в зависимости от удалённости цвета от “серой середины”

value_offset=(CONTRAST_MEDIAN-BGRTransTable[t][i])*c_offset/128;

if(BGRTransTable[t][i]-value_offset>CONTRAST_MEDIAN) BGRTransTable[t][i]=CONTRAST_MEDIAN;

else BGRTransTable[t][i]-=value_offset; }

else

{

// Рассчитываем смещение в зависимости от удалённости цвета от “серой середины”

value_offset=(BGRTransTable[t][i]-CONTRAST_MEDIAN)*c_offset/128;

if(BGRTransTable[t][i]+value_offset<CONTRAST_MEDIAN) BGRTransTable[t][i]=CONTRAST_MEDIAN;

else BGRTransTable[t][i]+=value_offset; }

}

elseif(c_offset>0)

//Увеличиваем контрастность

{ //Расчёт нижней границы цвета

int offset_b=c_offset*CONTRAST_MEDIAN/128;

//Все значения в таблице ниже нижней границы получат значения 0

for(t=0; t<3; t++)

for(b_index=0; b_index<256; b_index++)

{ if(BGRTransTable[t][b_index]<offset_b)

BGRTransTable[t][b_index]=0;

else break; }

// Расчёт верхней границы цвета

int offset_t=c_offset*128/CONTRAST_MEDIAN;

// Все значения в таблице ниже нижней границы получат значения 255

for(t=0; t<3; t++)

for(t_index=255; t_index>=0; t_index--)

{ if(BGRTransTable[t][t_index]+offset_t>255)

BGRTransTable[t][t_index]=255;

else break; }

//Расчёт шага изменения интенсивности цвета

double step=256./(256-(offset_b+offset_t));

// "Растягиваем" интенсивность цветов между нижней и верхней //границами до диапазона 0-255

for(t=0; t<3; t++)

{ value=0.;

for(i=b_index; i<=t_index; i++)

{ if(BGRTransTable[t][i]>=offset_b || BGRTransTable[t][i]<256- offset_t)

{value=(int)((BGRTransTable[t][i]-offset_b)*step+0.5);

if(value>255) value=255;

BGRTransTable[t][i]=(int)(value); }}}}

return TRUE; };


3.7 Фильтр “Инверсия”

Этот фильтр реализуется с помощью таблицы преобразований. Для его реализации добавим в программу класс CInvertColors (листинг 3.7.1), производный от класса CDotFilter.

Листинг 3.7.1 – Интерфейс класса CInvertColors.Файл Filter.h

//Инверсия цветов

class CInvertColors: public CDotFilter

{

public:

CInvertColors(); };

Операция инверсии цветов не требует никаких настроечных параметров, поэтому инициализация таблиц преобразования выполняется в конструкторе класса (листинг 3.7.1).

Листинг 3.7.1 – Конструктор класса CInvertColors .Файл Filter.cpp

CInvertColors::CInvertColors()

{for(int i=0, t=0; t<3; t++)

for(i=0; i<256; i++)

{BGRTransTable[t][i]=255-i; }

};

 


Информация о работе «Разработка программного обеспечения для фильтрации растровых изображений»
Раздел: Информатика, программирование
Количество знаков с пробелами: 64647
Количество таблиц: 3
Количество изображений: 9

Похожие работы

Скачать
117942
2
4

... обращений к реестру были проконтролированы при помощи Registry Monitor от Sysinternals Corp. 4.4 Описание программы Автоматизированная система для оценки уровня знаний студентов с применением технологии «Клиент-сервер» предназначена для проведения централизованных итоговых занятий по разным дисциплинам в виде интерактивного тестирования. Данный проект поддерживает совместимость с пакетом ...

Скачать
216821
0
4

... система обеспечивает совместное функционирование всех устройств ПК и предоставляет пользователю доступ к его ресурсам. WINDOWS 95, WINDOWS 98, WINDOWS ME, WINDOWS XP. Состав Операционной системы: 13)      Программный модуль, управляющий файлами. 14)      Командный процессор (выполняет команды пользователя). 15)      Программы, обеспечивающие управление работой различных устройств (ввода, ...

Скачать
51449
3
0

... либо записываются на винчестер в виде самостоятельного файла. В связи с тем, что на подавляющем числе современных компьютеров устанавливается операционная система Windows, имеющая собственные ресурсы (Записная Книжка) и специализированное программное обеспечение, встроенные редакторы, например Norton Commander, самостоятельно практически не используются. В составе функций, характерных для ...

Скачать
448518
14
55

... также невысока и обычно составляет около 100 кбайт/с. НКМЛ могут использовать локальные интерфейсы SCSI. Лекция 3. Программное обеспечение ПЭВМ 3.1 Общая характеристика и состав программного обеспечения 3.1.1 Состав и назначение программного обеспечения Процесс взаимодействия человека с компьютером организуется устройством управления в соответствии с той программой, которую пользователь ...

0 комментариев


Наверх