Компьютерное Зрение

В: Пусть дан один Pixel(x,y) в колонке x и строке y.
Запишите координаты его 8 Соседей слева-вверху, вверху, справа-вверху, справа и т.д.

                   
 x   ,y    
   
     О:   
x-1,y-1x  ,y-1x+1,y-1
x-1,yx  ,y  x+1,y
x-1,y+1x  ,y+1x+1,y+1

В: Объясните плюсы и минусы 4-ки- и 8-ки-Соседей.
О: 4-ка плюс: возможна подмена объекта и фона;
4-ка минус: отсутствие связаности косых линий противоречит человеческому восприятию.
Выход - все косые линии делать двойной толщины. 
8-ка: Плюсы: соответствует человеческому восприятию. 
8-ка Минусы: противоречие в том, что две единицы через угол связаны, а два нуля в той же ситуации не могут быть связаны.
Выход через вспомогательное правило: когда для объекта действует правило 8-ки соседей, тогда для фона действует правило 4-ки соседей.

В: Пусть дано Изображение

    101000
B = 100100
    100010
    100001

Сколько Областей существует для Объекта 1 и сколько для фона 0 при соседской 4-ке?
Сколько Областей существует для Объекта 1 и сколько для фона 0 при соседской 8-ке?
О: 
4-ка: Объект: 5 Областей, Фон: 2 Областей
8-ка: Объект: 2 Областей, Фон: 1 Областей

В: Каково расстояние от (x0,y0) до (x1,y1) в эвклидовой метрике и в растровой метрике?
О: Эвклид: Расстояние = Корень( (x1-x0)*(x1-x0) + (y1-y0)*(y1-y0) );
Растр: Расстояние = Значение(x1-x0) + Значение(y1-y0);

В: На каких клетках строится 3D-Растр? Что гласит правило Окаймления? Примеры?
О: 3D-Cells=Voxels, 2D-Cells=Pixels, 1D-Cells=Cracks, 0D-Cells=Points.
Правило О: Одна Клетка измерения n не может быть окаймлена другой Клеткой измерения n, а только Клетками более низкого измерения n-1, n-2 и т.д.
Примеры: Один Воксель окаймляется 6-ю Пикселами, 12 Крэками и 8 Точками. Один Пиксел окаймляется 4 Крэками и 4 Точками. Один Крэк окаймляется 2 Точками.

В: Пусть дано Бинарное Изображение. Что подразумевается под C1V-, C1H- и C0- Матрицами?
О: C1V-Матрица кодирует вертикальные Крэки между Объектом и Фоном (левые и правые вертикальные границы - Стены).
C1H кодирует горизонтальные Крэки между Объектом и Фоном ( горизонтальные границы - Потолки и Полы).
C0 кодирует конечные точки всех Крэков, которые находятся в C1V и C1H.
C1V- и C0-Матрицы на одну колонку шире, чем C2-Матрицы, 
C1H- и C0-Матрицы на одну Строку выше, чем C2-Матрица.

В: Пусть дано 4x3 Изображение и Предельное Значение s = 2.
Найти: C2-, C1V-, C1H- и C0-Матрицы.

       1030
Bild = 1456
       1300
О:
     0010        00110        0010       00110
C2 = 0111; C1V = 01001; C1H = 0101; C0 = 01111;
     0100        01100        0011       01111
                              0100       01100

В: Что такое Freeman-Code (Код Фримана)?

О:Freeman-Code популярен с 1970 года, кодирует Цепочку Пикселей через x- и y-Координаты Стартовой Точки плюс одна Цепочка из 8-ми возможных направлений к следующим Пикселам. Код-Направлений: от 0 Градусов по часовой стрелке с шагом в 45 Градусов: 000,001,010,011,100,101,110,111.

В: Почему Freeman-Code не подходит для Кодирования границ Областей? Проблемы?
О: Правило Окаймления гласит, что Пиксел окаймляется не другим Пикселом, а только Крэками и Точками. 
Проблема 1: Непонятно как должна проходить Цепочка - на границе Объекта или на границе Фона → Противоречие между внутренним и внешним Окаймлением.  
Проблема 2: Непонятная ситуация на маленьких Областях: Какая цепочка описывает Область размером в один Пиксел?

В: Цепной Код и его свойства?

О:Современный Код для кодировки границ Областей, начиная с 0-Клетки (x0,y0) Граница представляется в виде направленных Крэков 00=East, 01=South, 10=West, 11=North. Соблюдение правила Окаймления обязательно.
Свойство 1: Количество South-Крэков = количеству North-Крэков
Свойство 2: Количество East-Крэков = количеству West-Крэков
Свойство 3: Периметр Областей = Количеству Крэков
Условие 1: Стартовая Точка всегда находится на первом высшем переходе от Фона к Объекту.
Условие 2: Стартовый Крэк всегда направлен на Юг, т.е. направление обхода всегда такое, что Объект находится по левую руку, а Фон по правую руку.


В: Алгоритм обхода при соседской 4-ке в Псевдокоде ?
О:    if ( Пиксел слева впереди == Фон ) поворот налево;
else if ( Пиксел справа впереди == Фон ) идем прямо; else поворот направо.

В: Алгоритм обхода при соседской 8-ки в Псевдокоде ?
О:    if ( Пиксел справа впереди == Объект ) поворот направо;
else if ( Пиксел слева впереди == Объект ) идем вперед; else поворот налево.


В:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 4-ки. Алгоритм обхода находится на 0-Клетке x,y на конце East-Крэка. Сформулируйте следующий шаг Алгоритма.

О:   if ( b[y-1,x] < s ) goto north;
else if ( b[y,x] < s ) goto east; else goto south;



В:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 4-ки. Алгоритм обхода находится на 0-Клетке x,y на конце South-Крэка. Сформулируйте следующий шаг Алгоритма.

О:   if ( b[y,x] < s ) goto east;
else if ( b[y,x-1] < s ) goto south; else goto west;



В:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 4-ки. Алгоритм обхода находится на 0-Клетке x,y на конце West-Крэка. Сформулируйте следующий шаг Алгоритма.

О:   if ( b[y,x-1] < s ) goto south;
else if ( b[y-1,x-1] < s ) goto west; else goto north;



В:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 4-ки. Алгоритм обхода находится на 0-Клетке x,y на конце North-Крэка. Сформулируйте следующий шаг Алгоритма.

О:   if ( b[y-1,x-1] < s ) goto west;
else if ( b[y-1,x] < s ) goto north; else goto east;



В:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 8-ки. Алгоритм обхода находится на 0-Клетке x,y на конце East-Крэка. Сформулируйте следующий шаг Алгоритма.

O:   if ( b[y,x] >= s ) goto south;
else if ( b[y-1,x] >= s ) goto east; else goto north;



F:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 8-ки. Алгоритм обхода находится на 0-Клетке x,y на конце South-Крэка. Сформулируйте следующий шаг Алгоритма.

О:   if ( b[y,x-1] >= s ) goto west;
else if ( b[y,x] >= s ) goto south; else goto east;



В:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 8-ки. Алгоритм обхода находится на 0-Клетке x,y на конце West-Крэка. Сформулируйте следующий шаг Алгоритма.

О:   if ( b[y-1,x-1] >= s ) goto north;
else if ( b[y,x-1] >= s ) goto west; else goto south;


В:Дано Изображение в форме 2D-Массива Byte b[ySize,xSize] и Предельное Значение  s и действует правило соседской 8-ки. Алгоритм обхода находится на 0-Клетке x,y на конце North-Крэка. Сформулируйте следующий шаг Алгоритма.

О:   if ( b[y-1,x] >= s ) goto east;
else if ( b[y-1,x-1] >= s ) goto north; else goto west;



В: Находясь в точке (x0,y0), рассчитайте новые координаты и площадь Области во время Обхода - написать Алгоритм.
О: Int32 x = x0, y = y0, area= 0;
for all Directions:
{      if ( Direction == east  ) { x++; area += y; }
  else if ( Direction == south )   y++; 
  else if ( Direction == west ) { x--; area -= y; }
  else if ( Direction == north )   y--;
}


В: Дан Цепной Код: (1/0)swsseenennww. Нарисуйте Бинарное Изображение 3x3, которое содержит Область с соответствующим Окаймлением.
О: 011
   111
   110


В: Дано описание границ Области в виде Цепного Кода. Какие возможности построения Полигона из этого Кода существуют?
О: 1) Каждая начальная точка Крэка - один Вертекс Полигона = 1:1 Преобразование.
2) Вертексы будут создаваться только в начальных точках тех Крэков, где Код меняет свое направление.
3) Аппроксимация прямыми отрезками с допустимым отклонением epsilon.
4) Аппроксимация через Полином 3-й степени = Bézier-Кривая или кубический сплайн.

В: Аппроксимация прямыми отрезками с допустимым отклонением epsilon методом резинового ремня (Резинки)?
О: 1) Резинку закрепляем на текущей точке.
2) Переходим к следующей точке, Резинка растягивается.
3) Считаем расстояния от всех пройденных Точек до Резинки. Если каждое их посчитанных расстояний меньше или равно epsilon, то снова переходим на шаг 2), если нет, то идем к предпоследней точке назад и переходим к шагу 1).
4) Готово, если снова дошли до Стартовой Точке.

В:  Задана Область через Цепной Код (1/0)swsesenennww.

Найти: 1:1 Полигон, плюс его Периметр и Площадь.
Допишите программу вместо ..... :

int x0 = 1, y0 = 0;                     //
static string cracks = "swsesenennww";  //
static int x, y, i;                     //
Point[] p = new Point[cracks.Length+1]; //
int perimeter = cracks.Length, area = 0;
p[0].X = x = x0;
p[0].Y = y = y0;
for (i = 1; i <= cracks.Length; i++ )
{ switch( cracks[i-1] )
  { case 'e': ...............................................; break;
    case 's': ...............................................; break;
    case 'w': ...............................................; break;
    case 'n': ...............................................; break;
  }
  p[i].X = x; p[i].Y = y;
}
О:
  { case 'e': x++; area += y; break;
    case 's': y++;            break;
    case 'w': x--; area -= y; break;
    case 'n': y--;            break;
  }



В: Задана Область через Цепной Код (1,0)swsesenennww.
Найти: Центр Тяжести и описанный четырехугольник 1:1 Полигона.
Допишите программу вместо ..... :

int x0 = 1, y0 = 0;                    //
static string cracks = "swsesenennww"; //
int x, y, i;                           //
int xmin, ymin, xmax, ymax;            //
float sx = 0f, sy = 0f;                //
xmin = xmax = x = x0;                  //
ymin = ymax = y = y0;                  //
for (i = 0; i < cracks.Length; i++ )
{ switch( cracks[i] )
  { case 'e': ...............................................; break;
    case 's': ...............................................; break;
    case 'w': ...............................................; break;
    case 'n': ...............................................; break;
  }
  sx += ......; sy += ......;
}
sx /= ......; sy /= ......;

О:
  { case 'e': x++; if ( x > xmax ) xmax++; break;
    case 's': y++; if ( y > ymax ) ymax++; break;
    case 'w': x--; if ( x < xmin ) xmin--; break;
    case 'n': y--; if ( y < ymin ) ymin--; break;
  }
  sx += x; sy += y;
}
sx /= cracks.Length; sy /= cracks.Length;