Логотип StingRay

Социальные сети
FacebookInstagramRSSTwitterYouTubeВ контактеОдноклассники
FacebookInstagramRSSTwitterYouTubeВ контактеОдноклассники
Силуэт человека

Курсовая работа по обработке изображений

Настоящие методические указания предназначены, прежде всего, для студентов моей специальности 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;
Добавьте свой комментарий или войдите, чтобы подписаться/отписаться.
OpenId
Предпросмотр
Улыбка Подмигивание Дразнит Оскал Смех Огорчение Сильное огорчение Шок Сумасшествие Равнодушие Молчание Крутизна Злость Бешенство Смущение Сожаление Влюблённость Ангел Демон Задумчивость Рука-лицо Не могу смотреть Жирный Курсив Подчёркивание Зачёркивание Размер шрифта Гиперссылка Цитата
Загрузка…