CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Xử lý quay và dịch chuyển ảnh sử dụng OpenCV trong Python

Đăng lúc: 10:48 PM - 27/12/2023 bởi Charles Chung - 668

Trong bài viết này thôi sẽ hướng dẫn các bạn quay và dịch chuyển ảnh sử dụng OpenCV trong Python

Giới thiệu

Dịch chuyển và xoay ảnh là một trong những thao tác cơ bản nhất trong chỉnh sửa ảnh. Cả hai đều thuộc lớp biến đổi Affine. Do đó, trước khi nghiên cứu các phép biến đổi phức tạp hơn, trước tiên bạn nên học cách xoay và dịch hình ảnh bằng các chức năng có sẵn trong OpenCV. Hãy xem hai ví dụ cụ thể bên dưới

Quay ảnh

OpenCV cung cấp hàm getRotationMatrix2D() để tạo ma trận chuyển đổi ở trên.

Sau đây là cú pháp tạo ma trận xoay 2D:

getRotationMatrix2D(center, angle, scale)

Trong đó có các đối số sau:

  • center: tâm xoay cho hình ảnh đầu vào
  • angle: góc quay tính bằng độ
  • scale: hệ số tỷ lệ giúp chia tỷ lệ hình ảnh lên hoặc xuống theo giá trị được cung cấp

Xoay là một thao tác gồm ba bước:

  • Đầu tiên, bạn cần lấy tâm quay. Đây thường là tâm của hình ảnh bạn đang cố xoay.
  • Tiếp theo, tạo ma trận xoay 2D. OpenCV cung cấp hàm getRotationMatrix2D() mà chúng ta đã thảo luận ở trên.
  • Cuối cùng, áp dụng phép biến đổi affine cho hình ảnh, sử dụng ma trận xoay mà bạn đã tạo ở bước trước. Hàm warpAffine() trong OpenCV thực hiện công việc đó.
  • Hàm warpAffine() áp dụng phép biến đổi affine cho hình ảnh. Sau khi áp dụng phép biến đổi affine, tất cả các đường thẳng song song trong ảnh gốc cũng sẽ vẫn song song trong ảnh đầu ra.

Cú pháp đầy đủ cho warpAffine() được đưa ra dưới đây:

warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

Sau đây là các đối số của hàm:

  • src: pháp sư nguồn
  • M: ma trận biến đổi
  • dsize: kích thước của hình ảnh đầu ra
  • dst: hình ảnh đầu ra
  • flags: kết hợp các phương pháp nội suy như INTER_LINEAR hoặc INTER_NEAREST
  • borderMode: phương pháp ngoại suy pixel
  • borderValue: giá trị được sử dụng trong trường hợp đường viền không đổi, có giá trị mặc định là 0

Ví dụ sau đây sẽ quay ảnh 45 độ và co kích thước bằng 1/2 kích thước ảnh gốc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# import thư viện opencv
import cv2 as c
import numpy as np
# --------------------Xử lý quay ảnh------------------------
# đọc ảnh
img = c.imread('images/redgirl.jpg') 
# lấy thông tin ảnh height, width
(h, w, d) = img.shape 
# tính tâm ảnh
center = (w // 2, h // 2) 
# quay ảnh 45 độ tỉ lệ 0.5
m = c.getRotationMatrix2D(center, 45, 0.5) 
# thực hiện lệnh quay
imgrotated = c.warpAffine(img, m, (w, h))
# show ảnh gốc
c.imshow('img orgin',img)
# show ảnh quay
c.imshow('img rotated',imgrotated)
c.waitKey(0)

 

Kết quả

Dịch chuyển ảnh

Trong thị giác máy tính, dịch hình ảnh có nghĩa là dịch chuyển nó theo một số pixel xác định, dọc theo trục x và y. Đặt các pixel mà hình ảnh cần dịch chuyển là tx và ty. Sau đó, bạn có thể xác định ma trận dịch M:

Bây giờ, có một số điểm bạn nên lưu ý khi dịch chuyển hình ảnh theo giá trị tx và ty. Cung cấp các giá trị dương cho tx sẽ dịch chuyển hình ảnh sang phải và các giá trị âm sẽ dịch chuyển hình ảnh sang trái. Tương tự, giá trị dương của ty sẽ dịch chuyển hình ảnh xuống, trong khi giá trị âm sẽ dịch chuyển hình ảnh lên trên.

Hãy thực hiện dịch  theo các bước sau để dịch hình ảnh bằng OpenCV:

  • Đầu tiên, đọc hình ảnh và lấy chiều rộng và chiều cao của nó.
  • Tiếp theo, giống như bạn đã làm với thao tác xoay, hãy tạo một ma trận biến đổi, là một mảng 2D. Ma trận này chứa thông tin cần thiết để dịch chuyển hình ảnh dọc theo trục x và y.
  • Một lần nữa, giống như khi xoay, hãy sử dụng hàm warpAffine() trong bước cuối cùng này để áp dụng phép biến đổi affine.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# import thư viện opencv
import cv2 as c
import numpy as np
# đọc ảnh
img = c.imread('images/redgirl.jpg') 
# lấy thông tin ảnh height, width
(h, w, d) = img.shape 
# ---------------------Xử lý dịch chuyển ảnh----------------
# lấy tỉ lệ dịch chuyển theo x, y là 1/4 độ cao và rộng của ảnh
tx,ty=h/4, w/4
# tạo một matrix dịch chuyển sử dụng thư viện numpy
translation_matrix=np.array([
    [1,0,tx],
    [0,1,ty]
],dtype=np.float32)
# dịch chuyển ảnh
img_translated=c.warpAffine(src=img,M=translation_matrix,dsize=(w,h))
# hiển thị ảnh dịch chuyển
c.imshow('img translated',img_translated)
c.waitKey(0)
c.destroyAllWindows()

 

Kết quả

Nguồn tham khảo: https://learnopencv.com

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ