- •Литература
- •Введение
- •Введение в Image Processing Library
- •Основные понятия теории сигналов
- •Переход от непрерывных сигналов и преобразований к дискретным
- •Преобразование Фурье
- •Быстрое преобразование Фурье
- •Ввод изображений
- •Кодирование цветных изображений
- •Глубина и квантование цвета
- •Сжатие изображений
- •Форматы графических файлов
- •Работа с файлами в формате bmp
- •Зеркальные отражения изображений
- •Повороты изображений
- •Препарирование изображений
- •Бинаризация
- •Яркостный срез
- •Линейное контрастирование
- •Пилообразное контрастирование
- •Соляризация
- •Эквализация
- •Выполнение логических и арифметических операций над изображенями
- •Выполнение логических операций
- •Выполнение арифметических операций
- •Общие понятия фильтрации изображений
- •Масочная фильтрация
- •Генерация шума
- •Восстановления изображений на основе обратной фильтрации
- •Фильтрация Винера
- •Итерационные методы восстановления изображений
- •Алгебраические методы восстановления изображений
Пилообразное контрастирование
Рис. 1. Функции препарирования типа пилообразное контрастирование
void NotchedContrast(IplLUT* lut) { // Подготовка lookup-таблицы к пилообразному контрастированию lut->interpolateType = IPL_LUT_INTER; // режим интерполяции lut->num = 4; // количество ключевых значений lut->key[0] = 0; lut->key[1] = 85; lut->key[2] = 170; lut->key[3] = 255; lut->factor[0] = 3; // наклон lut->factor[1] = 3; // наклон lut->factor[2] = 3; // наклон lut->value[0] = 0; // величина сдвига lut->value[1] = 0; // величина сдвига lut->value[2] = 0; // величина сдвига }
Соляризация
Рис. 1. Функции препарирования типа соляризация
Смысл соляризации заключается в том, что участки исходного изображения, имеющие уровень белого или близкий к нему уровень яркости, после обработки имеют уровень черного. При этом сохраняют уровень черного и участки, имеющие его на исходном изображении. Уровень же белого на выходе приобретают участки, имеющие на входе средний уровень яркости (уровень серого).
void Solarize(IplImage* img, IplLUT* lut) { // Построение гистограммы для нахождения максимумов iplComputeHisto(img, plut); // Определение максимальной интенсивности int mx = 255; while(!lut->value[mx]) mx--; // Подготовка lookup-таблицы к соляризации lut->interpolateType = IPL_LUT_LOOKUP; // режим интерполяции lut->num = 257; // количество ключевых значений for(int i = 0; i < 257; ++i) { lut->key[i] = i; lut->factor[i] = 0; // наклон lut->value[i] = 4 * int(i - i * i / (double)mx); // величина сдвига } lut->key[i] = i; }
Эквализация
На первом этапе измеряется гистограмма исходного изображения. Для цифрового изображения, шкала яркостей которого, например, принадлежит целочисленному диапазону 0...255, гистограмма представляет собой таблицу из 256 чисел. Каждое из них показывает количество точек в кадре, имеющих данную яркость. Разделив все числа этой таблицы на общий размер выборки, равный числу используемых точек изображения, получают оценку распределения вероятностей яркости изображения.
На втором этапе выполняется само нелинейное преобразование, обеспечивающее необходимые свойства выходного изображения. При этом вместо неизвестного истинного интегрального распределения используется его оценка, основанная на гистограмме. С учетом этого все методы поэлементного преобразования изображений, целью которых является видоизменение законов распределения, получили название гистограммных методов. В частности, преобразование, при котором выходное изображение имеет равномерное распределение, называется эквализацией (выравниванием) гистограмм.
Характерной чертой многих изображений, получаемых в реальных изображающих системах, является значительный удельный вес темных участков и сравнительно малое число участков с высокой яркостью. Эквализация призвана откорректировать картину, выровняв интегральные площади участков с различными яркостями.
void CTestDoc::Equalize(IplImage* img) { // Создание lookup-таблиц IplLUT lut[3] ={{256 + 1, NULL, NULL, NULL, IPL_LUT_LOOKUP}, {256 + 1, NULL, NULL, NULL, IPL_LUT_LOOKUP}, {256 + 1, NULL, NULL, NULL, IPL_LUT_LOOKUP}};
// Создание и инициализация массива указателей на lookup-таблицы IplLUT* plut[3]; plut[0] = &lut[0]; plut[1] = &lut[1]; plut[2] = &lut[2]; // Инициализация членов lookup-таблиц CreateLUT(plut[0]); CreateLUT(plut[1]); CreateLUT(plut[2]); // Построение гистограммы для нахождения максимумов iplComputeHisto(img, plut); // Эквализация iplHistoEqualize(img, img, plut); // Удаление членов lookup-таблиц DeleteLUT(plut[0]); DeleteLUT(plut[1]); DeleteLUT(plut[2]); }