Курсовая работа по обработке изображений
- Опубликовано: 26.12.2007
Настоящие методические указания предназначены, прежде всего, для студентов моей специальности 230101 «Вычислительные машины, комплексы, системы и сети», которые хотели бы успешно выполнить курсовую работу по дисциплине с громким названием «Обработка изображений, распознавание образов и мультимедиа». Также они могут быть полезны для студентов и других специальностей и вообще всех интересующихся обработкой изображений и распознаванием текста.
- Задание на курсовую работу
- Документный интерфейс
- Открытие изображения
- Работа с изображением и его отображение
- Работа с точками и цветами
- Яркость точки и гистограммы изображения
- Изменения яркости и контрастности
- Изменение цветности (бинаризация, оттенки серого, негатив)
- Наложение шума и фильтры шумоподавления (сглаживания)
- Методы выделения границ
- Распознавание текста
- Непрерывное преобразование Фурье
- Дискретное преобразование Фурье
- Преобразование Уолша-Адамара
- Источники информации
Работа с точками и цветами
Для работы с элементами изображения – пикселями – удобнее всего использовать массив Bitmap.Canvas.Pixels[X,Y], так как он представляет собой двумерный массив всех точек изображения, каждый элемент которого – это цвет (класс TColor) точки. TColor – это 4-байтовый цвет, где самый старший (самый левый) байт – служебный, а остальные, слева направо, – байты значений цветовых каналов B (голубой), G (зелёный) и R (красный) – именно в такой последовательности. Очевидно, что ввиду отсутствия в языке Object Pascal явных средств доступа к отдельным битам приходится использовать логические операции and и or и операции сдвига shl и shr для выделения нужных байтов из 4-байтового значения (тип LongInt):
var B, G, R: Byte; Image: TImage; Pixel: TColor; begin Pixel := Image.Canvas.Pixels [0, 0]; R := Pixel and $000000FF; // или R := GetRValue (Pixel); G := (Pixel and $0000FF00) shr 8; // или G := GetGValue (Pixel); B := (Pixel and $00FF0000) shr 16; // или B := GetBValue (Pixel); … Pixel := B shl 8; Pixel := (Pixel or G) shl 8; Pixel := Pixel or R; Image.Canvas.Pixels [0, 0] := Pixel; end;
Однако за удобство приходится платить временем: работа через массив Pixels[X,Y] требует огромных ресурсов (из-за индексации по массиву), и на слабых машинах можно просто не дождаться результата. Поэтому есть замечательный метод Bitmap.ScanLine, который возвращает указатель на целую строку пикселей. Но элементы строки, на которую указывает ScanLine, – это уже не 4-байтовый цвет, а реальные единицы информации, соответствующие цветности картинки (для чёрно-белого изображения – 1 бит, для 4-цветного – 2 бита и т. д., для полноцветного – 3 или 4 байта). Поэтому здесь могут возникнуть свои трудности, вызванные всё теми же побитовыми операциями и выделением значений цветовых каналов в малоцветных (от 256 цветов и меньше) изображениях. На этот случай предлагается следующее: принудительно приводить цветность любой картинки к 65 тысячам цветов (3-байтовый цвет, где каналы идут всё в той же последовательности (B, G и R), по байту на канал), и работать так:
var B, G, R: Byte; Image: TImage; P: PByteArray; begin Image.Picture.Bitmap.PixelFormat := PF24Bit; P := Image.Picture.Bitmap.ScanLine [0]; X := 0; repeat R := P [X + 2]; G := P [X + 1]; B := P [X]; X := X + 3; until X > 3 * Image.Width – 1; end;