Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Топ:
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Интересное:
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Дисциплины:
2021-12-07 | 29 |
5.00
из
|
Заказать работу |
|
|
Во многих случаях класс описывает физический объект, существующий в одном экземпляре. Например, класс может быть предназначен для управления устройством ввода изображения с микроскопа, с помощью которого анализируются гистологические или цитологические препараты. Программа управления установкой создает один экземпляр этого класса и, вызывая те или иные его функции, осуществляет ввод изображения, его анализ и отображение на экране.
Однако чаще класс предназначен для описания множества однородных объектов: тех же гистологических срезов или томографических проекций, медицинских карт или историй болезней пациентов, анкет сотрудников предприятия и т. д. Как в этих случаях осуществляется обработка объектов?
Рассмотрим в качестве примера класс Image, описывающий набор полученных с помощью микроскопа и телекамеры увеличенных изображений медицинских препаратов – мазков крови группы пациентов. Пусть эти изображения хранятся не в формате битовых матриц, содержащем, кроме собственно изображения, еще и дополнительную управляющую информацию, а в виде однородных числовых массивов, заполненных кодами цветов последовательных точек изображения. Такой формат упрощает математическую обработку данных, хотя и несколько усложняет их вывод на экран. В случае 24-битовых цветных изображений каждый цветной пиксель будет описываться в файле тройкой байтов, содержащих интенсивности красного, зеленого и синего компонентов цвета данной точки экрана (рис. 5.1).
Рис. 5.1. Структура числового файла с цветным изображением
Для обращения к файлу с данными удобнее всего воспользоваться методом отображения файла на память, для чего в составе класса следует предусмотреть указатель на проекцию файла в памяти. Индексируя этот указатель, программа сможет прочитать любой байт файла.
|
Используя данные из файла, программа должна сформировать из них цветное изображение препарата; для этого в состав объекта должен входить небольшой блок совместимой памяти, размер которого соответствует размеру изображения препарата. В класс следует включить указатель на эту память, а также указатель на ее контекст устройства.
Для сравнения изображений препаратов друг с другом и визуального анализа результатов их обработки желательно выводить на экран сразу группу изображений (разумеется, в программе могут быть предусмотрены также и средства их вывода по отдельности в увеличенном масштабе). Этот общий кадр можно сформировать в большом глобальном блоке памяти (размером в окно приложения), который, после переноса в него отдельных изображений в требуемом порядке, будет копироваться в окно приложения.
Поскольку каждый создаваемый объект класса привязан к определенному файлу с изображением препарата, в составе класса должна иметься переменная, в которую будет передаваться имя этого файла. Наконец, в состав класса полезно включить целочисленную переменную для хранения номера изображения; эта переменная позволит управлять расположением отдельных изображений на экране.
Такой класс имеет минимальные функциональные возможности и его разумно использовать в качестве базового в программном комплексе, обеспечивающем обработку изображений:
class Image{
protected:
BYTE* ptr;// Указатель на проекцию файла в памяти
HBITMAP hBmp;// Совместимая память для хранения изображения
HDCP hdcMem;// Совместимый контекст этой памяти
char* name;// Имя файла с данными
int nmb;// Номер загруженного изображения
public:
Image(int nmb,char* name);// Конструктор класса
void View();// Функция вывода изображения
};
В открытую секцию класса включены объявления конструктора класса и функции View (), формирующей изображение конкретного объекта.
|
В программе объявляется массив из требуемого числа указателей на объекты типа Image:
Image* pImg[5];
Далее в цикле из 5 шагов создаются объекты класса Image; конструктору класса передаются в качестве аргументов номер изображения и имя содержащего его файла (предполагается, что в программе имеется массив char * names [] имен этих файлов):
for(int i=0;i<5;i++)
Img[i]=new Image(i,names[i]);
Конструктор класса, автоматически вызываемый при создании очередного объекта, выполняет отображение указанного файла с данными на память и создает блок совместимой памяти объекта.
Функция View (), входящая в состав класса Image, выводит цветное изображение, хранящееся в объекте, в совместимую память объекта и копирует затем эту память в соответствующее место совместимой памяти окна (в данном примере изображения препаратов имеют размер 100 ´ 100 пикселей):
void Image::View(){
for(int i=0;i<100;i++){// Цикл по столбцам изображения
for(int j=0;j<300;j+=3){// Цикл по строкам изображения
BYTE byte0=ptr[i*300+j];// Получим красный компонент
BYTE byte1=ptr[i*300+j+1];// Получим зеленый компонент
BYTE byte2=ptr[i*300+j+2];// Получм синий компонент
// Выведем цветную точку в совместимую память объекта
SetPixel(hdcMem,j/3,i,RGB(byte0,byte1,byte2));
}
}
// Скопируем память объекта в память кадра
BitBlt(hdcBigMem,5+nmb*105,5,100,100,hdcMem,0,0,SRCCOPY);
SetBkMode(hdcBigMem,TRANSPARENT);// Прозрачный фон символов
// Выведем под изображением имя файла
TextOut(hdcBigMem,5+nmb*105,108,name,strlen(name));
}
Нетрудно далее организовать (например, посредством меню) вызов функции View () в цикле для всех объектов Image:
for(int i=0;i<5;i++){// Цикл по всем объектам
pImg[i]->View();// Вызов View () для каждого объекта
}
}
Результат работы программы показан на рис. 5.2 (в действительности на экран выводятся цветные изображения).
Рис. 5.2. Исходные изображения 5 препаратов
Рассмотрим теперь случай, когда от базового класса Image образован производный класс с именем, например, Image Gray, предназначенный для обработки изображений препаратов, имеющих лишь несколько градаций серого цвета. Такие “упрощенные” исходные данные могут быть полезны при отладке программ цифровой обработки изображений. Заметим кстати, что файл с цветными изображениями при нашем методе кодирования будет содержать 30000 байтов (100 ´ 100 пикселей по три байта на пиксель), а файл с серым изображением будет в три раза короче, так как каждый пиксель будет описываться одним байтом.
|
Включим в класс конструктор и замещающую функцию View():
ImageGray:public Image{
public:
ImageGray (int n,cahr* f):Image(n,f){}
void View();
};
Новая функция View () будет отличаться от аналогичной функции базового класса алгоритмом заполнения совместимой памяти объекта; кроме того, она будет копировать блоки памяти объектов в память кадра на 130 пикселей ниже, чтобы можно было одновременно наблюдать изображения обоих классов:
void ImageGray::View(){
for(int i=0;i<100;i++){// Цикл по столбцам изображения
for(int j=0;j<100;j++){// Цикл по строкам изображения
BYTE byte=ptr[i*100+j];// Получим значение серого
// Выведем точку серого цвета в совместимую память объекта
SetPixel(hdcMem,j,i,RGB(byte,byte,byte));
}
}
// Скопируем память объекта в память кадра
BitBlt(hdcBigMem,5+nmb*105,5+130,100,100, hdcMem,
0,0,SRCCOPY);
SetBkMode(hdcBigMem,TRANSPARENT);// Прозрачный фон символов
// Выведем под изображениями имена файлов
TextOut(hdcBigMem,5+nmb*105,108+130,name,strlen(name));
}
Предположим теперь, что у нас имеются пять файлов с исходными полноцветными изображениями, из которых с помощью отдельной программы образованы пять файлов с серыми изображениями. Программа, использующая класс ImageGray, должна объявить пять указателей на базовый класс и столько же указателей на производный:
Image* pImg[5];
ImageGray* pImgGray[5];
после чего создать все 10 объектов:
for(int i=0;i<5;i++)
pImg[i] = new Image(i,names[i]);
for(int i=0;i<5;i++)
pImgGray[i] = new ImageGray(i,namesGray[i]);
Очевидно, что любые циклические действия с массивами изображений придется осуществлять отдельно для массивов двух классов:
for(int i=0;i<5;i++)
pImg[i]->View();
for(int i=0;i<5;i++)
pImgGray[i]->View();
Результат выполнения этих двух циклов приведен на рис. 5.3.
Рис. 5.3. Исходные полноцветные изображения и полученные из них изображения с несколькими градациями серого цвета
Если производных классов несколько, как это часто бывает на практике, то для каждого класса придется предусматривать отдельный цикл. Использование виртуальных функций, как это будет показано в следующем подразделе, позволяет обрабатывать объекты базового и производных классов в одном цикле, если обращаться к ним с помощью указателя на базовый класс.
|
|
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!