Xoay hình ảnh và lưu python
Trong hướng dẫn này, bạn sẽ học cách xoay hình ảnh bằng OpenCV. Ngoài ra, tôi cũng sẽ chỉ cho bạn cách xoay ảnh bằng hai chức năng tiện lợi của tôi từ thư viện imutils, $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3 và $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4, giúp xoay ảnh bằng OpenCV dễ dàng hơn (và yêu cầu ít mã hơn) Show Trước đây, chúng ta đã học cách dịch (i. e. , shift) một hình ảnh, lên, xuống, trái và phải (hoặc bất kỳ sự kết hợp nào). Chúng tôi hiện đang chuyển sang chủ đề xử lý hình ảnh tiếp theo của chúng tôi - xoay Xoay chính xác như âm thanh của nó. xoay hình ảnh theo một số góc, . Chúng tôi sẽ sử dụng để biểu thị số độ (không phải radian) mà chúng tôi đang xoay một hình ảnh.Tôi cũng sẽ chỉ cho bạn một số kỹ thuật giúp xoay hình ảnh bằng OpenCV dễ dàng hơn Để tìm hiểu cách xoay hình ảnh bằng OpenCV, chỉ cần tiếp tục đọc Tìm kiếm mã nguồn cho bài viết này?OpenCV Xoay hình ảnhTrong phần đầu tiên của hướng dẫn này, chúng ta sẽ thảo luận về cách OpenCV xoay hình ảnh và các chức năng có sẵn để xoay Từ đó, chúng tôi sẽ định cấu hình môi trường phát triển của mình và xem xét cấu trúc thư mục dự án của chúng tôi Sau đó, tôi sẽ chỉ cho bạn ba cách để xoay hình ảnh bằng OpenCV
Chúng tôi sẽ kết thúc hướng dẫn này bằng cách xem xét kết quả xoay vòng OpenCV của chúng tôi OpenCV xoay hình ảnh như thế nào?Tương tự như phép tịnh tiến, và có lẽ không có gì đáng ngạc nhiên, phép quay theo một góc có thể được xác định bằng cách xây dựng ma trận M ở dạng.Cho một mặt phẳng (x, y)-Cartesian, ma trận này có thể được sử dụng để xoay một vectơ độ (ngược chiều kim đồng hồ) quanh gốc tọa độ. Trong trường hợp này, gốc tọa độ thường là tâm của ảnh; .Từ ảnh gốc, I, ảnh được xoay, R, sau đó thu được bằng phép nhân ma trận đơn giản. Tuy nhiên, OpenCV cũng cung cấp khả năng (1) chia tỷ lệ (i. e. , thay đổi kích thước) một hình ảnh và (2) cung cấp một tâm xoay tùy ý xung quanh để thực hiện xoay Do đó, ma trận xoay đã sửa đổi của chúng tôi, M, là trong đó và và và tương ứng (x .Nếu toán học bắt đầu trở nên hơi choáng ngợp, đừng lo lắng - chúng ta sẽ chuyển sang một số mã giúp các khái niệm này rõ ràng hơn nhiều Định cấu hình môi trường phát triển của bạnĐể làm theo hướng dẫn này, bạn cần cài đặt thư viện OpenCV trên hệ thống của mình May mắn thay, OpenCV có thể cài đặt bằng pip $ pip install opencv-contrib-python Nếu bạn cần trợ giúp để định cấu hình môi trường phát triển của mình cho OpenCV, tôi thực sự khuyên bạn nên đọc hướng dẫn cài đặt OpenCV theo pip của tôi — nó sẽ giúp bạn thiết lập và chạy trong vài phút Bạn gặp sự cố khi định cấu hình môi trường phát triển của mình?Hình 1. Gặp sự cố khi định cấu hình môi trường phát triển của bạn?Tất cả những gì đã nói, là bạn
Vậy thì hãy tham gia PyImageSearch Plus ngay hôm nay Có quyền truy cập vào Jupyter Notebooks cho hướng dẫn này và các hướng dẫn khác của PyImageSearch được định cấu hình sẵn để chạy trên hệ sinh thái của Google Colab ngay trong trình duyệt web của bạn. Không cần cài đặt Và trên hết, những Notebook Jupyter này sẽ chạy trên Windows, macOS và Linux Cấu trúc dự ánTrước khi chúng tôi có thể triển khai xoay vòng với OpenCV, trước tiên hãy xem lại cấu trúc thư mục dự án của chúng tôi Đảm bảo rằng bạn truy cập phần “Tải xuống” của hướng dẫn này để truy xuất mã nguồn và hình ảnh ví dụ, rồi từ đó, hãy xem qua bên trong $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files Ở đây, chúng ta có $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3. Tập lệnh này sẽ tải $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4 (hoặc bất kỳ hình ảnh nào khác mà bạn chọn) và sau đó áp dụng một loạt phép xoay cho nó, qua đó trình bày cách thực hiện phép xoay với OpenCV Thực hiện xoay hình ảnh với OpenCVBây giờ chúng tôi đã sẵn sàng để triển khai xoay hình ảnh với OpenCV Mở tệp $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3 trong cấu trúc thư mục dự án của bạn và chèn đoạn mã sau # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args()) Dòng 2-4 nhập các gói Python cần thiết của chúng tôi. Chúng tôi sẽ sử dụng $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files6 cho các đối số dòng lệnh, imutils cho tập hợp các hàm tiện ích OpenCV của tôi (cụ thể là các phương thức $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3 và $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4) và $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files9 cho các ràng buộc OpenCV của chúng tôi Chúng tôi chỉ có một đối số dòng lệnh duy nhất, # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())0, là đường dẫn đến hình ảnh đầu vào mà chúng tôi muốn xoay (mà chúng tôi mặc định là $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4) Tiếp theo, hãy tải hình ảnh đầu vào của chúng tôi từ đĩa và thực hiện một số thay đổi kích thước cơ bản $ pip install opencv-contrib-python1 Chúng tôi bắt đầu bằng cách tải hình ảnh đầu vào của chúng tôi và hiển thị nó trên màn hình của chúng tôi Hình 2. Đang tải hình ảnh đầu vào của chúng tôiKhi chúng tôi xoay một hình ảnh, chúng tôi cần chỉ định xung quanh điểm mà chúng tôi muốn xoay. Trong hầu hết các trường hợp, bạn sẽ muốn xoay quanh tâm của hình ảnh; Hãy tiếp tục và xoay quanh tâm của hình ảnh. Dòng 18 và 19 lấy chiều rộng và chiều cao của hình ảnh rồi chia từng thành phần cho # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())2 để xác định tâm của hình ảnh Giống như chúng ta xác định một ma trận để dịch một hình ảnh, chúng ta cũng xác định một ma trận để xoay hình ảnh. Thay vì xây dựng ma trận theo cách thủ công bằng cách sử dụng NumPy (có thể hơi tẻ nhạt), chúng ta sẽ chỉ gọi phương thức # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())3 trên Dòng 22 Hàm # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())3 nhận ba đối số. Đối số đầu tiên là điểm mà chúng ta xoay hình ảnh (trong trường hợp này là tâm # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())5 và # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())6 của hình ảnh) Sau đó, chúng tôi chỉ định , số độ (ngược chiều kim đồng hồ) mà chúng tôi sẽ xoay hình ảnh. Trong trường hợp này, chúng ta sẽ xoay hình ảnh 45 độ.Đối số cuối cùng là tỷ lệ của hình ảnh. Chúng tôi chưa thảo luận về việc thay đổi kích thước hình ảnh, nhưng ở đây bạn có thể chỉ định một giá trị dấu phẩy động, trong đó 1. 0 có nghĩa là giống nhau, kích thước ban đầu của hình ảnh được sử dụng. Tuy nhiên, nếu bạn chỉ định giá trị là 2. 0, hình ảnh tăng gấp đôi kích thước — tương tự, giá trị 0. 5 nửa kích thước hình ảnh Khi chúng ta có ma trận xoay # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())7 từ hàm # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())3, chúng ta có thể áp dụng phép xoay cho hình ảnh của mình bằng phương pháp # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())9 trên Dòng 23 Đối số đầu tiên của hàm này là $ pip install opencv-contrib-python10 mà chúng ta muốn xoay. Sau đó, chúng tôi chỉ định ma trận xoay # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())7 và kích thước đầu ra (chiều rộng và chiều cao) của hình ảnh của chúng tôi. Dòng 24 sau đó hiển thị hình ảnh của chúng tôi được xoay 45 độHình 3. Xoay hình ảnh với OpenCV. Độ dương xoay hình ảnh ngược chiều kim đồng hồ Các dòng 27-29 làm tương tự, nhưng lần này xoay một hình ảnh _______112 độ (theo chiều kim đồng hồ) quanh tọa độ _______65 và _______66 ở tâm Ghi chú. Hãy nhớ rằng trong OpenCV, độ dương xác định xoay ngược chiều kim đồng hồ trong khi độ âm biểu thị xoay theo chiều kim đồng hồ. Giữ nó trong tâm trí; Hình 4 hiển thị đầu ra của các thao tác thay đổi kích thước này Như bạn có thể thấy, hình ảnh của chúng tôi đã được xoay. Hãy dành một chút thời gian để lưu ý rằng OpenCV không tự động phân bổ không gian cho toàn bộ hình ảnh được xoay của chúng tôi để vừa với khung Đây là hành vi dự định. Nếu bạn muốn toàn bộ hình ảnh vừa với chế độ xem sau khi xoay, bạn cần sửa đổi chiều rộng và chiều cao, được ký hiệu là $ pip install opencv-contrib-python15 trong hàm # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())9. Như chúng ta sẽ thấy ở phần sau trong tập lệnh này, hàm $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4 sẽ đảm nhận tất cả những việc đó cho chúng ta Cho đến thời điểm này, chúng tôi chỉ xoay một hình ảnh về trung tâm của hình ảnh. Nhưng nếu chúng ta muốn xoay hình ảnh về một số điểm tùy ý thì sao? Hãy tiếp tục và xem làm thế nào điều này có thể được thực hiện $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files7 Đến bây giờ, mã này trông khá chuẩn để thực hiện phép quay. Tuy nhiên, hãy lưu ý đối số đầu tiên của hàm # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())3. Ở đây, chúng tôi chỉ ra rằng chúng tôi muốn xoay hình ảnh xung quanh x = 10, y = 10 hoặc xấp xỉ góc trên cùng bên trái của hình ảnh Khi chúng tôi áp dụng cách xoay này, hình ảnh đầu ra của chúng tôi trông như thế này Hình 5. Sử dụng OpenCV để xoay hình ảnh của chúng tôi 45 độ ngược chiều kim đồng hồ xung quanh x = 10, y = 10Ta có thể thấy tâm xoay không còn là tâm của ảnh Tuy nhiên, cũng giống như việc dịch một hình ảnh, thực hiện lệnh gọi tới cả # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())3 và # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())9 có thể trở nên khá tẻ nhạt — chưa kể nó còn làm cho mã của chúng ta trở nên dài dòng hơn đáng kể Hãy giảm số lượng mã chúng ta cần viết bằng cách gọi $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3, một chức năng tiện lợi kết thúc các cuộc gọi đến # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())3 và # import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", type=str, default="opencv_logo.png", help="path to the input image") args = vars(ap.parse_args())9 $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3 Ở đây, chúng tôi xoay hình ảnh của mình 180 độ, nhưng chúng tôi có thể làm cho mã của mình ít dài dòng hơn đáng kể bằng cách sử dụng phương thức $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files74 Hình 6 hiển thị đầu ra của vòng quay của chúng tôi Hình 6. Xoay hình ảnh của chúng tôi 180 độ bằng OpenCV và imutilsNhư bạn đã thấy trong các ví dụ trước, OpenCV không phân bổ đủ dung lượng để lưu trữ toàn bộ hình ảnh nếu một phần của hình ảnh bị cắt trong quá trình xoay Cách giải quyết vấn đề đó là sử dụng hàm $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4 $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files5 Chức năng này sẽ tự động mở rộng mảng hình ảnh sao cho toàn bộ hình ảnh được xoay nằm gọn trong nó Kết quả của việc áp dụng hàm $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files76 có thể được nhìn thấy trong Hình 7, trong đó chúng ta xoay hình ảnh 33 độ ngược chiều kim đồng hồHình 7. Xoay hình ảnh của chúng tôi 33 độ ngược chiều kim đồng hồ trong khi đảm bảo toàn bộ hình ảnh được xoay vẫn hiển thị trong khu vực có thể xem được Và đó là tất cả để có nó Ghi chú. Hàm $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4 đảo ngược mối quan hệ giữa các giá trị dương/âm và xoay theo chiều kim đồng hồ/ngược chiều kim đồng hồ. Ở đây, các giá trị âm sẽ xoay ngược chiều kim đồng hồ trong khi các giá trị dương sẽ xoay theo chiều kim đồng hồ Khi áp dụng xoay ảnh với OpenCV, bạn có ba tùy chọn
Trộn và kết hợp chúng khi bạn thấy phù hợp với các ứng dụng của riêng bạn Kết quả xoay hình ảnh OpenCVĐể xoay hình ảnh bằng OpenCV, hãy nhớ truy cập phần “Tải xuống” của hướng dẫn này để lấy mã nguồn và hình ảnh ví dụ Chúng tôi đã xem xét kết quả của tập lệnh này trong phần trước, nhưng khi bạn đã sẵn sàng chạy tập lệnh cho chính mình, bạn có thể sử dụng lệnh sau $ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files9 Kết quả xoay vòng OpenCV của bạn phải khớp với kết quả của tôi từ phần trước Cái gì tiếp theo?Thông tin khóa học. Tôi thực sự tin rằng nếu bạn có đúng giáo viên, bạn có thể thành thạo thị giác máy tính và học sâu Bạn có nghĩ rằng việc học thị giác máy tính và học sâu tốn nhiều thời gian, quá sức và phức tạp không? Đó không phải là trường hợp Tất cả những gì bạn cần để thành thạo thị giác máy tính và học sâu là nhờ ai đó giải thích mọi thứ cho bạn bằng các thuật ngữ đơn giản, trực quan. Và đó chính xác là những gì tôi làm. Nhiệm vụ của tôi là thay đổi giáo dục và cách dạy các chủ đề Trí tuệ nhân tạo phức tạp Nếu bạn nghiêm túc về việc học thị giác máy tính, điểm dừng chân tiếp theo của bạn phải là Đại học PyImageSearch, khóa học trực tuyến về thị giác máy tính, học sâu và OpenCV toàn diện nhất hiện nay. Tại đây, bạn sẽ học cách áp dụng thành công và tự tin tầm nhìn máy tính vào công việc, nghiên cứu và dự án của mình. Tham gia cùng tôi trong việc làm chủ thị giác máy tính Bên trong Đại học PyImageSearch, bạn sẽ tìm thấy
Nhấn vào đây để tham gia Đại học PyImageSearch Tóm lượcTrong hướng dẫn này, bạn đã học cách xoay hình ảnh bằng OpenCV. Để xoay hình ảnh theo một góc tùy ý với OpenCV, chúng ta cần
Kết quả là hình ảnh đã được xoay độ.Vấn đề với việc sử dụng các hàm của OpenCV để xoay hình ảnh là chúng yêu cầu hai dòng mã — một dòng để xây dựng ma trận xoay và sau đó là dòng khác để thực hiện chuyển đổi Để giúp xoay hình ảnh với OpenCV dễ dàng hơn, tôi đã triển khai hai phương thức trong thư viện imutils của mình
Tôi khuyên bạn nên làm quen với cả ba kỹ thuật xoay vì bạn có thể sẽ sử dụng từng kỹ thuật khi phát triển quy trình xử lý hình ảnh tương ứng của riêng mình Để tải mã nguồn về bài đăng này (và được thông báo khi các hướng dẫn trong tương lai được xuất bản tại đây trên PyImageSearch), chỉ cần nhập địa chỉ email của bạn vào biểu mẫu bên dưới Tải xuống Mã nguồn và Hướng dẫn tài nguyên 17 trang MIỄN PHÍNhập địa chỉ email của bạn dưới đây để có được một. zip của mã và Hướng dẫn tài nguyên 17 trang MIỄN PHÍ về Thị giác máy tính, OpenCV và Học sâu. Bên trong, bạn sẽ tìm thấy các hướng dẫn, sách, khóa học và thư viện được chọn lọc thủ công của tôi để giúp bạn thành thạo CV và DL |