середа, 28 квітня 2021 р.

Афінні перетвореня в OpenCV

Mathedemo OpenCV надає функції перетворення, resize, warpAffine та warpPerspective які виконують всі види перетворень, як афінних так і проективних, а також різні методи інтерполяції.

Розтяг та стиснення

Функція resize змінює розміри зображення, фактично виконуючи розтягнення вздовж осей $x$ та $y$ з коефіцієнтами $s_x$ i $s_y$ відповідно. Приклад двох способів використання для збільшення зображення в два рази

 
img = cv2.imread('foto.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
#або
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
Для зменшення зображення, як правило, використовують метод інтерполяції INTER_AREA а для збільшення зображення -- INTER_CUBIC (повільний), або INTER_LINEAR (швидший). Параметр interpolation є необов'язковим, за замовчуванням, для всіх режимів зміни розміру використовується метод інтерполяції INTER_LINEAR.

Паралельне перенесення

Функція warpAffine використовує розширену $2 \times 3$-матрицю афінного перетворення, яка утворюється і з приписування до матриці повороту координат вектора паралельного перенесення. Паралельне перенесення має одиничну матрицю повороту з вектором $(b_1, b_2)$ і в OpenCV визначається розширеною матрицею $$ \begin{pmatrix} 1 &0 & b_x,\\ 0 & 1 & b_y \end{pmatrix}. $$ Приклад виконання паралельного перенесення на вектор $(100,50):$


height, width = img.shape[0:2]
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(width, height))
 
Третій параметр функції warpAffine задає розміри вихідного зображення.

Поворот

В OpenCV матриця повороту визначається функцією getRotationMatrix2D параметрами якої є центр повороту, кут повороту і коефіцієнт розтягу. Приклад виконання повороту на $30^\circ$ з центром на перетині діагоналей прямокутника зображення

 
rows, cols = img.shape[0:2]#визначаємо розміри
M = cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),30,0.9)# визначаємо  матрицю повороту
dst = cv2.warpAffine(img,M,(cols,rows))
 
Функція invertAffineTransform(M) знаходить матрицю оберненого перетворення.

Симетрія

Віддзеркалення виконує функція cv2.flip з двома параметрами, приклад використання

 
# Відображення відносно осі  y
flipped = cv2.flip(img, 1)
# Відображення відносно осі  x 
flipped = cv2.flip(img, 0)
cv2_imshow(flipped)
# Відображення відносно центру координат
flipped = cv2.flip(img, -1)
cv2_imshow(flipped)
Для інших типів віддзеркалень можна використовувати функцію warpAffine попередньо визначивши розширену матрицю відзеркалення.

У випадку коли потрібно відновити зображення над яким виконали афінне перетворення, матриця якого невідома, в OpenCV є функція getAffineTransform яка знаходить матрицю такого перетворення за трійками відповідних точок на кожному зображенні. Координати цих точок вибирають вручну, або при допомозі алгоритмів виділення контурів, як правило це мають бути характерні точки зображень, що повинні накластися одна на одну при перетворенні. Після того як відомі координати відповідних точок, можна відновити початкове положення зображення

 
rows,cols = img.shape[0:2]
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
 
Також координати пікселів зображення можна визначити обробивши положення курсора мишки функцією setMouseCallback

Немає коментарів:

Дописати коментар