Компьютерная обработка изображений

Автор работы: Пользователь скрыл имя, 24 Декабря 2012 в 22:09, контрольная работа

Описание работы

В данном задании рассматриваются одноместная и двухместная бинарная операция ИЛИ с изображением. Ее суть в том, чтобы увеличить яркость участков изображения, если она ниже константы.
В цветовой модели RGB для хранения значения интенсивности каждого цветового компонента выделяется один байт, т.е. интенсивность может принимать значения в диапазоне от 0(минимальная интенсивность) до 255 (28-1) (максимальная интенсивность). Цвет пикселя описывается структурой размером 3 (или 4) байта.

Содержание работы

1. Задание №1.Написать программы, реализующие логические операции
с изображением:………………………………………………………………….3
1.1.Одноместная операция (в преобразование участвует изображение и некоторое константное значение) - операция ИЛИ с изображением.
1.2.Двухместная операция (в преобразование участвуют два изображения) - операция ИЛИ с изображением (выделение на изображении областей, которые имеют белый цвет).
2. Задание №2.Написать программы, реализующие арифметические операции с изображением:……………………………………………………….7
2.1.Одноместная (в преобразовании участвует изображение и некоторое константное значение) операция – (вычитание) с изображением.
2.2.Двухместная (в преобразовании участвуют два изображения) операция – (вычитание) с изображением (выделение на изображении областей, которые имеют белый цвет).
3. Задание №3.Написать программы, реализующие логические операции с изображением:……………………………………...……………………………11
3.1.Увеличение и уменьшение изображения с использованием метода определения неизвестных значений по ближайшему соседнему пикселю.
3.2.Увеличение и уменьшение изображения с использованием метода определения неизвестных значений с использованием кубической интерполяции.
4. Задание №4.Написать программу, реализующую масочную фильтрацию на основе заданных масок (двухмерных массивов):…………………………..18
4.1. Горизонтальный градиентный фильтр Превитта:
1 1 1
0 0 0
-1 -1 -1
4.2. Вертикальный градиентный фильтр Превитта:
-1 0 1
-1 0 1
-1 0 1
4.3. Горизонтальный градиентный фильтр Собеля:
1 2 1
0 0 0
-1 -2 -1
4.4. Вертикальный градиентный фильтр Собеля:
-1 0 1
-2 0 2
-1 0 1
5. Delphi 7………………………………………………………………………..25

Файлы: 1 файл

Kursovaya_rabota.doc

— 7.84 Мб (Скачать файл)

 

 

Задание №4.

Теоретическая часть:

Обычно изображения, сформировавшиеся различными информационными системами, искажены действиями помех. Это затрудняет в дальнейшем как их визуальный анализ человеком, так и математическую обработку в ЭВМ. Иногда бывает необходимо выделить переходы от одного цвета к другому.

При фильтрации – яркость каждой точки исходного изображения, искаженного помехой, заменяется некоторым другим значением яркости, которое признается в наименьшей степени искаженной помехой.

Изображение часто представляет собой двумерную функцию в  пространстве координат; помеха тоже представляет собой двумерную функцию. С тем лишь различием, что изображение меняется по своим координатам значительно медленнее, чем помеха:

Рисунок 1– Пример использования  фильтрации

 

Это позволяет при  оценке полезного сигнала в каждой точке кадра принять во внимание некоторое множество соседних точек, воспользовавшись некоторой похожестью сигналов в этих точках. В других случаях, наоборот, признаком полезного сигнала являются резкие перепады яркости (частота этих перепадов невелика). Так что, на значительных промежутках между ними, сигнал либо постоянный, либо изменяется медленно. И в этом случае свойство сигнала проявляется при наблюдении его не только в локальной точке, но и при анализе ее окрестности (понятие окрестности является достаточно условным). Она может быть образована лишь ближайшими по кадру соседями. Но могут быть и окрестности, содержащие достаточно много, достаточно удаленных точек кадра. В этом случае степень влияния далеких и близких точек на решение, принимаемое фильтром в далекой точке кадра, будет совершенно различная.

Из выше сказанного следует, что существует множество видов фильтрации изображений, но наиболее простой для понимания и реализации на сегодняшний день является масочная фильтрация.

Масочная фильтрация изображений представляет собой  разновидность линейной двумерной фильтрации изображений.

Эти фильтры представляют собой апертуры (маски) различной  конфигурации на плоскости. Каждому элементу апертуры соответствует (присваивается исследователем) число, в дальнейшем называемое весовым множителем.

Фильтрация осуществляется перемещением слева-направо (или сверху-вниз) апертуры фильтра (маски) на один пиксель. При каждом положении апертуры производятся однотипные операции, а именно перемножение весовых множителей с соответствующими значениями яркостей исходного изображения и суммированием полученных результатов. Полученное значение делится на заранее заданное число (нормирующий множитель), которое и присваивается центральному значению апертуры (это и есть ''выход'' фильтра). Размеры апертуры берутся таким образом, чтобы центральный элемент апертуры определяется однозначно. Наиболее употребимый размер апертуры 3*3, 5*5.

Таким образом, получается отфильтрованное изображение (линейным образом) изображение, причем термин локальный свидетельствует о том, что размеры апертуры по обеим осям меньше соответствующих размеров исходного (фильтруемого) изображения. В противном случае мы имеем уже глобальную фильтрацию.

Данные фильтры (Собеля и Превитта) позволяют выделять контуры  на изображении – вертикальные и  горизонтальные (в зависимости от вида фильтра) цветовые переходы. При этом области одного цвета будут окрашены в черный цвет. Для этого необходимы хотя бы 3 ряда пикселей (для горизонтальной фильтрации) или 3 столбца (для вертикальной фильтрации). Отличие фильтра Собеля заключается в том, что два весовых коэффициента больше, чем у фильтра Превитта. У обоих фильтров текущая строка (или текущий столбец) исходного изображения не несут вклад в расчет нового пикселя (соответствующие коэффициенты равны нулю).

 

Описание работы программы:

Программы написаны с  использованием C++ (из комплекта Visual Studio 2005) и Win32 API.

Программа представляет собой диалоговое окно с двумя  кнопками – Load File … и OK. При нажатии кнопки ОК происходит выход из приложения. При нажатии кнопки Load File … появляется окно загрузки файла. После загрузки происходит фильтрация и рисование полученного изображения. Также присутствуют 4 переключателя, позволяющие выбирать вид масочной фильтрации (вертикальную Превитта, горизонтальную Превитта, вертикальную Собеля, горизонтальную Собеля). При нажатии на переключатель происходит перерисовка результирующего изображения.

 

 

Основные операции выполняет  функция Operation, получающая в качестве входных параметров дескриптор контекста устройства диалогового окна и ссылка на массив, задающий матрицу фильтрации:

 

void Operation(HDC hdc,int (&iMask)[3][3])

{

   DWORD dwColor = 0;

   long lRSum = 0,lGSum = 0,lBSum = 0;

 

   for(long y=0; y<HEIGHT; y++)

   {

  for(long x=0; x<WIDTH; x++)

  {

  lRSum = lGSum = lBSum = 0;

  for (int i=-1;i<2;i++)

  {

  for (int j=-1;j<2;j++)

  {

  if((y+i>=0) && (y+i<=HEIGHT))

  {

  if((x+j>=0) && (x+j<=WIDTH))

  {

  dwColor =

                           GetPixel(hdc,x+j+SRC_X_OFFSET,y+i+Y_OFFSET);              

  lRSum +=

                           iMask[i+1][j+1]*GetRValue(dwColor);

  lGSum +=

                           iMask[i+1][j+1]*GetGValue(dwColor);

  lBSum +=

                           iMask[i+1][j+1]*GetBValue(dwColor);

  }

  }

  }

  }

  if(lRSum < 0)

  lRSum = 0;

  else if(lRSum > 255)

  lRSum = 255;

  if(lGSum < 0)

  lGSum = 0;

  else if(lGSum > 255)

  lGSum = 255;

  if(lBSum < 0)

  lBSum = 0;

  else if(lBSum > 255)

  lBSum = 255;

  SetPixel(hdc,RES_X_OFFSET+x,Y_OFFSET+y,

                          RGB((BYTE)lRSum,(BYTE)lGSum,(BYTE)l BSum));

  }

   }

}

 

В функции объявлены  следующие переменные:

DWORD dwColor – цвет точки исходного изображения;

long lRSum, lGSum, lBSum – преобразованный компонент.

В функции организуются циклы по всем точкам исходного изображения. Далее находятся вложенные циклы for для переменных i и j. С помощью них получают значения координат всех точек исходного изображения для расчета фильтрации. Точки будут использоваться, только если они лежат в пределах изображения.

 

   …

      for (int i=-1;i<2;i++)

      {

for (int j=-1;j<2;j++)

{

if((y+i>0) && (y+i<HEIGHT))

{

if((x+j>0) && (x+j<WIDTH))

{

                       ...

Далее значение точки  исходного изображения заносится  в переменную dwColor. После каждый цветовой компонент умножается на коэффициент из матрицы фильтрации. Полученное значение суммируется с предыдущим. К коэффициентам матрицы прибавлена единица, так как переменные i и j имеют начальное значение -1, а индексы массива начинаются с нуля.

 

. . .

               dwColor = GetPixel(hdc,x+j+SRC_X_OFFSET,y+i+Y_OFFSET);              

         lRSum += iMask[i+1][j+1]*GetRValue(dwColor);

   lGSum += iMask[i+1][j+1]*GetGValue(dwColor);

   lBSum += iMask[i+1][j+1]*GetBValue(dwColor);

                                                                           . . .

Далее происходит проверка полученных значений на их диапазон (не менее 0 и не более 255 для BYTE). Если значения не входят в диапазон от 0 до 255, то они приравниваются либо к 0, либо к 255.

 

. . .

              if(lRSum < 0)

  lRSum = 0;

  else if(lRSum > 255)

  lRSum = 255;

  if(lGSum < 0)

  lGSum = 0;

  else if(lGSum > 255)

  lGSum = 255;

  if(lBSum < 0)

  lBSum = 0;

  else if(lBSum > 255)

  lBSum = 255;

  SetPixel(hdc,RES_X_OFFSET+x,Y_OFFSET+y,

                          RGB((BYTE)lRSum,(BYTE)lGSum,(BYTE)l BSum));

. . .

Выводы:

Данный вид масок  фильтрации позволяет выделять границы  цветовых переходов либо по вертикали, либо по горизонтали. Изображение, полученное использованием фильтра Собеля, несколько светлее. Это связано с большими весовыми коэффициентами.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Результаты рассмотренного алгоритма представлены на рисунках:

 

 

Вертикальный фильтр Превитта            

Горизонтальный фильтр Превитта


Вертикальный фильтр Собеля:

Горизонтальный фильтр Собеля:


 

В расмотренном алгоритме  есть недостаток – не выделяются границы  переходов от более темных (меньших  значений интенсивностей) к более  светлым пикселям. Это связано  с тем, что в этом случае будет  получено отрицательное значение нового пикселя, которое будет зануляться. Чтобы этого избежать, можно взять значения по модулю и лишь ограничивать максимальное значение:

 

lRSum = abs(lRSum);

if(lRSum > 255)

  lRSum = 255;

lGSum = abs(lGSum);

if(lGSum > 255)

  lGSum = 255;

lBSum = abs(lBSum);

if(lBSum > 255)

  lBSum = 255;

 

 

 

 

 

 

 

Вертикальный фильтр Превитта

Горизонтальный фильтр Превитта:

Вертикальный фильтр Собеля:

Горизонтальный фильтр Собеля:


 

 

 

 

 

 

 

 

 

 

 

 

 

Delphi 7.

 

Задание №1. Логические операции с изображениями.

1.1. Одноместная (в преобразование участвует изображение и некоторое

константное значение) операция И с изображением (выделение областей

интенсивность, которых  выше некоторой константы).

1.2. Двухместная (в преобразование участвуют два изображения) операция И с изображением (выделение на изображении областей, которые имеют одинаковый цвет).

Задание №2. Арифметические операции с изображениями.

2.1. Одноместная (в преобразование участвует изображение и некоторое константное значение) операция + (сложение) с изображением (повышение

яркости изображения).

2.2. Двухместная (в преобразование участвуют два изображения) операция

+ (сложение) с изображением.

Задание№3. Геометрические преобразования изображений.

3.1. Увеличение и уменьшение изображения с использованием метода определения неизвестных значений по ближайшему соседнему пикселу.

3.2. Увеличение и уменьшение изображения с использованием метода определение неизвестных значений с использованием линейной интерполяции.

Описание работы программы (Delphi 7).

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

    { Private declarations }

  public

    { Public declarations }

  end;

   mas=array[1..9,1..9] of byte;

const

  n=9; map=10;

  {Исходные  изображения}

  {2-х цветное: 0-чёрный  цвет(BLACK), 1-белый цвет(WHITE)}

pic1:mas = ((0,1,0,1,0,1,0,1,0),(0,1,0,1,0,1,0,1,0),(0,1,0,1,0,1,0,1,0),

(0,1,0,1,0,1,0,1,0),(0,1,0,1,0,1,0,1,0),(0,1,0,1,0,1,0,1,0),

(0,1,0,1,0,1,0,1,0),(0,1,0,1,0,1,0,1,0),(0,1,0,1,0,1,0,1,0));

{3-х цветное: 0-чёрный  цвет(BLACK), 127-серый цвет(GRAY), 255-белый  цвет(WHITE)}

pic3:mas =  ((0,127,255,0,127,255,0,127,255),(0,127,255,0,127,255,0,127,255),

(0,127,255,0,127,255,0,127,255),(0,127,255,0,127,255,0,127,255),

(0,127,255,0,127,255,0,127,255),(0,127,255,0,127,255,0,127,255),

(0,127,255,0,127,255,0,127,255),(0,127,255,0,127,255,0,127,255),

(0,127,255,0,127,255,0,127,255));

    {2-х цветное: 0-чёрный цвет()BLAC, 1-белый цвет(WHITE)}

  pic2:mas =((0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1),(0,0,0,0,0,0,0,0,0),

                    (1,1,1,1,1,1,1,1,1),(0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1),

                     (0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1),(0,0,0,0,0,0,0,0,0));

 

 

 


 

 

 

 

 

 

var

  Form1: TForm1;

  xb,yb,scale:integer;

  pic:mas;

implementation

{$R *.dfm}

function MyPixel(pix:byte):TColor;

begin

  if pix=0 then Result:=clBlack

    else Result:=clWhite;

end;

function PixelColor(pix:word):TColor;

begin

  if pix=0 then Result:=clBlack

    else if pix=127 then Result:=clGray

      else Result:=clWhite;

end;

function NotPixel(pix:byte):byte;

begin

  if pix=0 then Result:=1

    else Result:=0

end;

procedure TForm1.FormPaint(Sender: TObject);

var

  i,j,k1,k2,xb1,xb2,yb2:integer;

  color,c1:integer;

begin

Form1.Color:=clMoneyGreen;

xb:=30; yb:=30;

  for i:=1 to n do

    for j:=1 to n do

      for k1:=1 to map do

        for k2:=1 to map do

          Canvas.Pixels[xb+(j-1)*map+k2-1,yb+(i-1)*map+k1-1]:=MyPixel(pic1[i,j]);

xb1:=xb+(n+4)*map; yb:=30;

  for i:=1 to n do

    for j:=1 to n do

      for k1:=1 to map do

        for k2:=1 to map do

          Canvas.Pixels[xb1+(j-1)*map+k2-1,yb+(i-1)*map+k1-1]:=MyPixel(pic2[i,j]);

 xb2:=xb1;

 

{Исходное изображение (для одноместных операций)}


 

 

 

 

 

 

 

 

 

 xb2:=xb; yb2:=yb+(n+4)*map;

  for i:=1 to n do

    for j:=1 to n do

      for k1:=1 to map do

        for k2:=1 to map do

         Canvas.Pixels[xb2+(j-1)*map+k2-1,yb2+(i-1)*map+k1-1]:=PixelColor(pic3[i,j]);

{Исходное изображение(для одноместных операций)}

 xb2:=xb; yb2:=yb+(n+4)*map;

  for i:=1 to n do

    for j:=1 to n do

      for k1:=1 to map do

        for k2:=1 to map do

         Canvas.Pixels[xb2+(j-1)*map+k2-1,yb2+(i-1)*map+k1-1]:=PixelColor(pic3[i,j]);

Задание №1.

{Одноместная операция  И с изображением(выделение областей,

интенсивность которых  выше некоторой константы)

константа pix=127(clGray)}

xb2:=xb2+(n+4)*map; yb2:=yb+(n+4)*map;

  for i:=1 to n do

    for j:=1 to n do

      for k1:=1 to map do

        for k2:=1 to map do

         if (pic3[i,j]>127) then Canvas.Pixels[xb2+(j-1)*map+k2-1,yb2+(i-1)*map+k1-1]:=clWhite

           else Canvas.Pixels[xb2+(j-1)*map+k2-1,yb2+(i-1)*map+k1-1]:=clBlack;

 

 


 

 

 

 

 

 

 

 

 

{ Двухместная операция И с изображением(выделение на изображении

Информация о работе Компьютерная обработка изображений