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 - 975Trong 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!
Các bài cũ hơn
- Làm thế nào để gửi email trong Asp.Net Core 6 sử dụng thư viện MailKit và MimeKit (03:01 PM - 27/12/2023)
- Resize hình ảnh sử dụng thư viện OpenCV trong Pyhton (10:57 AM - 25/12/2023)
- Cài đặt và sử dụng thư viện OpenCV trong Python với Visual Code (10:48 AM - 24/12/2023)
- Sinh mã số kế tiếp dựa vào một mẫu cho trước bằng C# hoặc Java (10:47 AM - 22/12/2023)
- Lambda Expression và Functional Interface trong java 8 (09:11 AM - 21/12/2023)