- •230100 – Информатика и вычислительная техника
- •Часть 2. Алгоритмы цифровой обработки изображений 58
- •Часть 3. Методические указания для практических и лабораторных работ 109
- •Введение
- •Часть 1. Программирование графического адаптера nvidia с использованием технологии cuda
- •Краткая история развития графических адаптеров
- •Архитектура nvidia cuda
- •Архитектура gpu-приложения
- •Основные различия между cpu и cuda-устройством
- •Различие возможностей между поколениями cuda-устройств
- •Инструментарий cuda Toolkit
- •Установка
- •Проверка правильности установки
- •Компиляция примеров
- •Прикладные программные интерфейсы cuda
- •Особенности компиляции
- •Опции компилятора nvcc
- •Профайлер
- •Отладка программ в режиме эмуляции устройства
- •Среда разработки nvidia Parallel Nsight
- •Подключаемые библиотеки
- •Библиотека cublas
- •Библиотека cufft
- •Часть 2. Алгоритмы цифровой обработки изображений
- •Видоизменение гистограммы изображения
- •Основы пространственной фильтрации
- •Сглаживающие пространственные фильтры
- •Сглаживание изображений локальным усреднением
- •Сглаживание по обратному градиенту
- •Сглаживающий сигма-фильтр
- •Сглаживание по наиболее однородным областям
- •Медианный фильтр
- •Описание метода медианной фильтрации
- •Одномерный медианный фильтр
- •Зависимость качества работы медианного фильтра от размера апертуры
- •Двумерный медианный фильтр
- •Пространственные фильтры выделения границ областей
- •Линейные методы выделения границ областей. Лапласиан
- •Нелинейные методы выделения границ областей
- •Оператор Превита
- •Частотные фильтры
- •Сглаживающий частотный фильтр
- •Частотный фильтр повышения резкости
- •Гомоморфная фильтрация
- •Морфологическая фильтрация
- •Операции математической морфологии
- •Дилатация
- •Алгебраические свойства дилатации и эрозии
- •Применение морфологической дилатации
- •Применение морфологической эрозии
- •Размыкание и замыкание
- •Применение морфологических операций размыкания и замыкания
- •Основные морфологические алгоритмы
- •Выделение границ.
- •Заполнение областей.
- •Выпуклая оболочка.
- •Утончение.
- •Утолщение.
- •Построение остова.
- •Часть 3. Методические указания для практических и лабораторных работ
- •Практическая работа №1. Введение в технологию cuda
- •Цель работы
- •Порядок выполнения работы
- •Теоретическая часть
- •Архитектура графических адаптеров nvidia.
- •Архитектура чипа g80.
- •Архитектура чипа Fermi.
- •Вычислительные способности графического процессора.
- •Среда разработки cuda.
- •Язык cuda с.
- •Модель программирования cuda.
- •Теоретическая часть Модель памяти cuda
- •Особенности глобальной памяти.
- •Особенности разделяемой памяти.
- •Теоретическая часть Программный пакет «Sarcis».
- •Команды меню.
- •Панель инструментов.
- •Механизм подключения динамических библиотек.
- •Создание внешней библиотеки
- •Пример листинга программы динамической библиотеки.
- •Медианная фильтрация
- •Варианты индивидуальных заданий
- •Выбор по дискретному критерию.
- •Выбор по среднему контрасту.
- •Выбор по среднему градиенту.
- •Выбор на основе простых статистик.
- •Параметрическая аппроксимация.
- •Моментный подход.
- •Варианты индивидуальных заданий
- •Теоретическая часть
- •Инициализация устройства.
- •Выделение памяти на gpu
- •Пересылка данных между cpu и gpu.
- •Вызов функции ядра.
- •Методические рекомендации
- •Цель работы
- •Варианты индивидуальных заданий
- •Методические рекомендации
- •Защита лабораторной работы
- •Лабораторная работа № 3. Работа с разделяемой памятью в технологии cuda
- •Порядок выполнения работы
- •Методические рекомендации
- •Методические рекомендации
- •Особенности текстурной памяти.
- •Особенности линейной текстурной памяти.
- •Защита лабораторной работы
- •Правила оформления отчета
- •Оформление титульного листа
- •Библиографический список
Пример листинга программы динамической библиотеки.
В листинге приведен шаблон создания динамической библиотеки.
#include "stdafx.h" #include "math.h" #include <stdlib.h> #include <stdio.h> #include <limits.h> #include <time.h>
#define EXPORT extern "C" __declspec(dllexport)
const int FCount = 4;
const char *Names[] = { "Инверсия на CPU", "Медиана на CPU", "Фильтр Собеля на GPU", "Импульсный шум 5%" };
const char *Procs[] = { "NegativCpu", "MedianFiltCpu", "FiltrSobelGPU", "ImpulsNose" };
char *Description = "Отладочная библиотка.";
const int FuncID[] = {0,0,1,0}; // Идентификатор функции: 0 - CPU, 1 - GPU. По порядку описания.
inline bool Invalid(int NumF) { return (NumF < 1) || (NumF > FCount); }
EXPORT int GetCount() { return FCount; }
EXPORT char * GetName(int NumF) { return (Invalid(NumF))? "Error" : (char *)Names[NumF - 1]; }
EXPORT char * GetProc(int NumF) { return (Invalid(NumF))? "XZ" : (char *)Procs[NumF - 1]; }
EXPORT char * GetDescription() { return Description; }
EXPORT int GetFuncID(int NumF) { return FuncID[NumF-1]; }
/******************************************************************** * Функции, реализующие перечисленные выше методы. *********************************************************************/
/******************************************************************** * 1 - Инверсия *********************************************************************/
EXPORT float NegativCpu(unsigned char *inbuf,unsigned char *outbuf,int height, int width ) { int start = GetTickCount(); // запускаем таймер for(int j=0;j<width*height;j++) outbuf[j]=255-inbuf[j]; return (float)(GetTickCount()-start); // Получаем результат таймера }
/******************************************************************** * 2 – Медиана 3x3 *********************************************************************/ EXPORT float MedianFiltCpu(unsigned char *inbuf,unsigned char *outbuf,int height, int width ) { unsigned char wind[9], tmp; int start = GetTickCount(); // запускаем таймер for(int i=1; i<height-1 ;i++) for(int j=1; j<width-1; j++) { wind[0]=inbuf[j+i*width]; wind[1]=inbuf[(j-1)+(i-1)*width]; wind[2]=inbuf[j+(i-1)*width]; wind[3]=inbuf[(j+1)+(i-1)*width]; wind[4]=inbuf[(j-1)+i*width]; wind[5]=inbuf[(j+1)+i*width]; wind[6]=inbuf[(j-1)+(i+1)*width]; wind[7]=inbuf[j+(i+1)*width]; wind[8]=inbuf[(j+1)+(i+1)*width];
for(int k = 0; k <= 8; k++) { for(int m = 0; m <= 7-k; m++) { if( wind[m]>wind[m+1] ) { tmp = wind[m]; wind[m] = wind[m+1]; wind[m+1] = tmp; } } } outbuf[j+i*width]=wind[4]; } // Получаем результат таймера return (float)(GetTickCount()-start); }
/******************************************************************** * 3 – Собель 3x3 GPU *********************************************************************/ EXPORT float FiltrSobelGPU(unsigned char *inbuf,unsigned char *outbuf,int height, int width ) { double Gx,Gy; int start = GetTickCount(); // запускаем таймер . . .
// Получаем результат таймера return (float)(GetTickCount()-start); }
/******************************************************************** * 4 – Импульсный шум 5% *********************************************************************/ EXPORT float ImpulsNose(unsigned char *inbuf,unsigned char *outbuf,int height, int width ) { for(int i=0; i<(height*width-1); i++) { outbuf[i]=inbuf[i]; } unsigned int number; unsigned int r; for(int i=0; i<height ;i++) for(int k=0;k<width*0.05;k++) { r=rand()%width; if(outbuf[i*width+r]>128) outbuf[i*width+r]=0; else outbuf[i*width+r]=255; } return 0.0; // Получаем результат таймера }
|
Отчет по практической работе
Отчет по практической работе должен соответствовать порядку выполнения работы и содержать конспект изученного материала. По ходу выполнения практической работы в файл отчета помещайте с помощью буфера обмена вид экрана и диалоговых окон (используйте клавиши <PrintScrn> и <Alt>+<PrintScrn>) с описанием проделанной работы.
Практическая работа №4. Методы фильтрации изображения
Цель работы
Целью работы является изучение методов фильтрации изображения.
Порядок выполнения работы
1. Изучить методы линейной фильтрации.
2. Составить схемы алгоритмов методов линейной фильтрации согласно индивидуальному заданию.
3. Изучить методы медианной фильтрации.
4. Составить схемы алгоритмов методов медианной фильтрации согласно индивидуальному заданию.
Теоретическая часть
Методы линейной фильтрации.
Методы линейной фильтрации предназначены
для улучшения качества зашумленных
изображений с сохранением или даже
обострением перепадов яркости.
Значительная часть алгоритмов фильтрации
описывается локальными операторами
свертки. Маска оператора свертки состоит
из весовых коэффициентов
.
Масочным фрагментом изображения
называется совокупность отчетов
,
одновременно вовлекаемых в обработку
оператором свертки с весами
.
Маска скользит по изображению и в каждом
положении
осуществляет
весовое суммирование отчетов изображения,
формула 3.1
.
(3.1)
Отклик фильтра записывается в центре пространственного окна.
Локальное усреднение
Уровень яркости рассматриваемого элемента изображения заменяется средним значением всех отчетов в окне, формула 3.2
.
(3.2)
Взвешенный по Гауссу фильтр
Уровень яркости рассматриваемого элемента изображения заменяется средним взвешенным значением уровней яркости, полученным путем свертки отчетов со скользящей маской:
,
или
.
Сглаживание по методу обратного градиента
Идея метода в
специальном выборе весовых коэффициентов
маски оператора, учитывающей статистические
характеристики изображения. В частности,
чем больше абсолютное значение разности
между
и
,
тем меньший вес при усреднении необходимо
придавать отчету
.
Для
-окна
с центром в точке
процедура
сглаживания изображения
в
данном случае описывается по формуле
(3.3).
,
(3.3)
где
,
,
а
Сигма-фильтр
Метод базируется на предположении о
гауссовом типе распределения шума. В
этом случае в среднем 95,5% отчетов яркости
должны принадлежать диапазону
,
где
– среднее
значение яркости,
–среднеквадратичное
отклонение шума. Точки, яркость которых
не удовлетворяет условию двух сигм,
должны исключаться из процедуры
усреднения.
В качестве
можно
использовать само значение
.
В этом случае для
-окна
усредненное значение яркости в центральной
точке
определяется
по формуле (3.4).
,
(3.4)
где
Сглаживание по наиболее однородной окрестности
В переделах (5×5)-окна выбираются 9 окон меньшего размера (см. рис.2.4 во второй части данного пособия).
Сглаживание по K ближайшим соседям
Суть метода
заключается в замене яркости
центральной
точки
-
окна средним уровнем яркости
ближайших
по яркости соседей, где
.
