Перейти до вмісту

Поворот зображень


Повідомлень в темі: 5

#1 comdev

    Абориген

  • Користувачі
  • PipPipPipPip
  • 119 повідомлень
  • Місто:Kyiv

Відправлено 18.05.2007 – 14:34

  • 5
Люди, хто знає швидкий алгоритм поворот зображень на 90 градусів для середовища C++Builder?

#2 mohi

    Ледар

  • Користувачі
  • PipPip
  • 17 повідомлень

Відправлено 31.05.2007 – 20:33

На рахунок швидкості нічого сказати не можу, але загальна схема така:

При повороті системи координат XY в декартовій площині відносно початку координат, на певний кут w координати точки Р в новій системі координат (х`,y`):
х` = х*Cos w + y*Sin w
y` = х*Sin w + y*Cos w

проходишся по всьому зображенню і до кожної точки приміняєш ці формули, по результатах малюєш нове зображення
  • 0

#3 mim

    Генеральний писар

  • Користувачі
  • PipPipPipPipPipPipPipPipPip
  • 680 повідомлень
  • Стать:Чоловік
  • Місто:Київ

Відправлено 01.06.2007 – 18:43

Алгоритм - штука загальна, він не може бути для певного середовища. Це перше, друге
Поворот на довільний градус і на 90 градусів - різні речі. Вказані у другому пості формули - для довільного повороту (але до них ще треба алгоритм інтерполяції). Швидкість там, звісно, буде мала, бо обчислень багато.
Мене вчили, що поворот на 90 виконується десь так:
for (i=0; i<=(n div 2)+1; i++) {
for (j=i; j<=(n-i-1); j++) {
t=M[i,j]
M[i,j]=M[n-j, i];
M[n-j, i]=M[n-i,n-j];
M[n-i,n-j]=M[j,n-i];
M[j,n-i]=t;
}}
Краще прокрутити на папері для матриці 4х4, тоді буде ясно, як воно працює. Це для квадратної матриці NxN.
Для прямокутної все простіше - створюєш нову матрицю і заповнюєш її m2[j,m-i-1]:=m1[i,j]
  • 0

#4 mohi

    Ледар

  • Користувачі
  • PipPip
  • 17 повідомлень

Відправлено 02.06.2007 – 22:01

а що таке інтерполяція? Я користувався тими формулами що навів і наскільки пам"ятаю ніяких додаткових алгоритмів не використовував.
  • 0

#5 mim

    Генеральний писар

  • Користувачі
  • PipPipPipPipPipPipPipPipPip
  • 680 повідомлень
  • Стать:Чоловік
  • Місто:Київ

Відправлено 05.06.2007 – 12:08

Інтерполяція - знаходження значень функції в місцях, де вона не визначена, базуючись на відомих значеннях. Мені якось зручніше думати у координатах результуючого зображення. Візьмемо піксел (6;10), на вихідному зображенні йому відповідає точка
х = х'*Cos(-w) + y'*Sin(-w) = 10.8
y = х'*Sin(-w) + y'*Cos(-w) = 7.47 , якщо я правильно порахував поворот на 30 градусів. Але вихідне зображення дискретне, на ньому немає такої точки, а є окремі точки (10;7), (10;8), (11;7), (11;8) і т.д. Так от інтерполяція - це саме процес знаходження значення кольору в точці (10.8; 7.47), коли відомі кольори сусідніх точок.
  • 0

#6 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 06.02.2009 – 08:46

Перегляд дописуmohi (31.05.2007 20:33) писав:

На рахунок швидкості нічого сказати не можу, але загальна схема така:

При повороті системи координат XY в декартовій площині відносно початку координат, на певний кут w координати точки Р в новій системі координат (х`,y`):
х` = х*Cos w + y*Sin w
y` = х*Sin w + y*Cos w

проходишся по всьому зображенню і до кожної точки приміняєш ці формули, по результатах малюєш нове зображення

Неправилна. Бiля одного синуса (якого-небудь, якого саме - залежить у який з двох напрямкив поверне) треба минус. :)

Тож правилна так:
х` = х*Cos w (+|-)y*Sin w
y` = (-|+)х*Sin w + y*Cos w
  • 0



Кількість користувачів, що читають цю тему: 1

0 користувачів, 1 гостей, 0 анонімних