3.5 Класс “Фильтр”

Выполнение задачи подразумевает существование в программе некоторого объекта-фильтра. Фильтры выполняют разные преобразования, но с точки зрения "фильтрации" они все одинаковы и обращаться с ними она будет единообразно. Поэтому нам надо определить базовый класс CFilter для фильтра с минимальным, но основным набором методов, с помощью которых будет происходить общение. Данные класса - два указателя на объекты-картинки класса Craster:

- m_рSourseBM - адрес объекта "исходная картинка", откуда берутся данные для преобразования;

- m_рDestBM - адрес объекта "приемная картинка", куда помещаются преобразованные данные.

Методы класса:

- SetBuffers () - сообщает фильтру адреса исходного и приемного изображения;

- TransformPix() – преобразует данные одного пиксела с координатами (x,y).

Переменная-указатель на этот класс m_pCurFilter заведена в классе CBMDoc. Этой переменной присваивается адрес текущего фильтра.

Для реализации точечных методов преобразования создаём класс CdotFilter (Листинг 3.7.1).

Листинг 3.7.1 – Базовый класс для точечных фильтров CdotFilter. Файл Filter.h

//Базовый класс для точечных фильтров

class CDotFilter: public CFilter

{

protected:

//Таблицы преобразования для компонентов цвета

BYTE BGRTransTable[3][256];

public:

//Метод преобразования пиксела

BOOL TransformPix(LONG x, LONG y);};

Данными этого класса являются три таблицы преобразования компонентов RGB цвета.

Для точечного фильтра переопределён метод . Реализация метода приведена в листинге 3.7.2

Листинг 3.7.2 – Метод CDotFilter:: TransformPix (). Файл Filter.cpp

BOOL CDotFilter::TransformPix(LONG x, LONG y)

{BYTE *pDPix=NULL, *pSPix=NULL;

// Источник необходим

if(m_pSourceBM==NULL)

return FALSE;

//Если приёмник не задан, то преобразование помещаем в источник

if(m_pDestBM==NULL)

m_pDestBM=m_pSourceBM;

// Получаем указатели на пикселы в источнике и приёмнике

if((pDPix=m_pDestBM->GetPixPtr(x, y))==NULL ||

(pSPix=m_pSourceBM->GetPixPtr(x, y))==NULL)

return FALSE;

// Преобразование. Порядок BGR

*pDPix=BGRTransTable[0][*pSPix];

*(pDPix+1)=BGRTransTable[1][*(pSPix+1)];

*(pDPix+2)=BGRTransTable[2][*(pSPix+2)];

return TRUE; };

Хотя формат 24-битового цвета называют RGB, в файле формата BMP компоненты цвета хранятся в обратном порядке (Порядок BGR).

В производных от CDotFilter классах останется реализовать инициализацию таблиц преобразования.

Для реализации пространственных (матричных) методов преобразования создаём класс CMatrixFilter. Интерфейс класса приведён в листинге 3.7.3

Листинг 3.7.3 – Интерфейс базового для матричных фильтров класса CmatrixFilter. Файл Filter.h

// Пространственные (матричные фильтры)

// Базовый класс

class CMatrixFilter: public CFilter

{

protected:

int m_rangX; // размер матрицы по X и Y

int m_rangY;

const int *m_pMatrix; // указатель на матрицу

public:

//Методпреобразования пиксела

BOOL TransformPix(LONG x, LONG y); };

Данными этого класса являются размер матрицы преобразования и указатель на матрицу. Размер мртрицы определяет зону пикселов, окружающих пиксел (x,y), которая будет вовлечена в расчёт нового значения пиксела (x,y). Указателю на матрицу преобразования m_pMatrix будет присваиваться адрес матрицы, которая будет использована в преобразовании. Реализация метода CmatrixFilter:: TransformPix() приведена в листинге3.7.4

Листинг 3.7.4 – Метод CmatrixFilter:: TransformPix(). Файл Filter.cpp

// Пространственные фильтры

BOOL CMatrixFilter::TransformPix(LONG x, LONG y)

{BYTE *pDPix=NULL, *pSPix=NULL;

// Источник и приёмник необходимы

if(m_pSourceBM==NULL || m_pDestBM==NULL)

return FALSE;

// Определяем зону перекрытия изображения и матрицы. Это требуется для //обработки пикселов, находящихся на границах изображения

int x_start=0;

int dx=m_rangX/2, dy=m_rangY/2;

if(x-dx<0) x_start=dx-x;

int y_start=0;

if(y-dy<0) y_start=dy-y;

int x_finish=m_rangX;

if(x+dx>m_pSourceBM->GetBMWidth())

x_finish-=(x+dx-m_pSourceBM->GetBMWidth());

int y_finish=m_rangY;

if(y+dy>m_pSourceBM->GetBMHeight())

y_finish-=(y+dy-m_pSourceBM->GetBMHeight());

// Расчёт новых значений цвета пиксела с учётом соседей, попавших в зону //действия матрицы преобразования

int NewBGR[3];

int count=0;

for(int c=0, mx=0, my=0; c<3; c++)

{NewBGR[c]=0; count=0;

for(my=y_start; my<y_finish; my++)

for(mx=x_start; mx<x_finish; mx++)

{if((pSPix=m_pSourceBM->GetPixPtr(x+(mx-dx), y+(my-dy)))!=NULL)

{NewBGR[c]+=(m_pMatrix[my*m_rangX+mx]*(*(pSPix+c)));

count+=m_pMatrix[my*m_rangX+mx]; }}}

// Адрес пиксела в изображении-приёмнике

pDPix=m_pDestBM->GetPixPtr(x, y);

//Установка нового значения в приёмное изображение

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

{

// Приведение значения к допустимому диапазону

if(count!=0)

NewBGR[c]=NewBGR[c]/count;

if(NewBGR[c]<0)

NewBGR[c]=0;

else if(NewBGR[c]>255)

NewBGR[c]=255;

*(pDPix+c)=NewBGR[c]; }

return TRUE; };

В методе CmatrixFilter:: TransformPix() сначала определяется область перекрытия изображения и матрицы преобразования. Этот шаг необходим в связи с тем, что на границах изображения пиксел может не иметь соседей.

Новое значение пиксела формируется с учетом значений всех пикселов и коэффициентов матрицы преобразования, попавших в область перекрытия изображения и матрицы преобразования.


Информация о работе «Разработка программного обеспечения для фильтрации растровых изображений»
Раздел: Информатика, программирование
Количество знаков с пробелами: 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 комментариев


Наверх