- 1. Chuyển đổi hình ảnh - Chuyển đổi liên kết và không liên kết
- 2. Dịch hình ảnh - Di chuyển hình ảnh lên, xuống, trái và phải
- 3. Xoay hình ảnh - Quay hình ảnh
- 4. Chia tỷ lệ, thay đổi kích thước và nội suy
- 5. Hình ảnh Kim tự tháp - Một cách khác để thay đổi kích thước
- 6. Cắt - Cắt vùng hình ảnh bạn muốn
- 7. Các phép toán số học để làm sáng và tối hình ảnh
Trong hướng dẫn trước, chúng ta đã tìm hiểu về OpenCV và thực hiện một số xử lý hình ảnh cơ bản bằng cách sử dụng nó như chia tỷ lệ màu xám, độ bão hòa màu, biểu đồ, không gian màu, thành phần RGB, v.v. Như đã nói trong hướng dẫn trước, OpenCV là Thư viện Nguồn mở Commuter Vision có Giao diện C ++, Python và Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. Vì vậy, nó có thể dễ dàng cài đặt trong Raspberry Pi với môi trường Python và Linux. Và Raspberry Pi với OpenCV và camera kèm theo có thể được sử dụng để tạo nhiều ứng dụng xử lý hình ảnh thời gian thực như Nhận diện khuôn mặt, khóa khuôn mặt, theo dõi đối tượng, phát hiện biển số ô tô, Hệ thống an ninh gia đình, v.v.
Trong hướng dẫn này, chúng ta sẽ xem cách chúng ta sẽ thao tác hình ảnh bằng OpenCV. Ở đây chúng ta sẽ học cách áp dụng hàm sau trên một hình ảnh bằng OpenCV:
- Chuyển đổi hình ảnh - Chuyển đổi Affine và Không Affine
- Dịch hình ảnh - Di chuyển hình ảnh lên, xuống, trái và phải
- Xoay hình ảnh - Xoay hình ảnh
- Chia tỷ lệ, thay đổi kích thước và nội suy
- Hình ảnh Kim tự tháp - Một cách khác để thay đổi kích thước
- Cắt - Cắt vùng hình ảnh bạn muốn
- Các phép toán số học để làm sáng và tối hình ảnh
1. Chuyển đổi hình ảnh - Chuyển đổi liên kết và không liên kết
Sự biến đổi là sự biến dạng hình học được tạo ra trên một hình ảnh, sự biến dạng chắc chắn ở đây không có nghĩa là sai lầm mà là một kiểu hiệu chỉnh để sửa các vấn đề phối cảnh phát sinh từ điểm mà hình ảnh được chụp. Có hai kiểu biến đổi hình ảnh - Affine và Non-Affine
Phép biến đổi affine có ba loại là tỉ lệ, phép quay và phép tịnh tiến, điều quan trọng trong phép biến đổi affine là các đường thẳng song song trước và sau phép biến hình.
Các phép biến đổi không liên kết hoặc phép biến đổi xạ ảnh không bảo toàn tính song song, độ dài hoặc góc, tuy nhiên, nó bảo toàn tính thẳng hàng và tỷ lệ, tính thẳng hàng có nghĩa là hai điểm nằm trên cùng một đường thẳng.
Các phép biến đổi phi Affine rất phổ biến trong thị giác máy tính và được tạo ra từ các góc máy ảnh khác nhau. Phép biến đổi không affine hoặc phép biến đổi xạ ảnh còn được gọi là phép đồng hình.
2. Dịch hình ảnh - Di chuyển hình ảnh lên, xuống, trái và phải
Dịch hình ảnh là di chuyển hình ảnh lên, xuống, sang trái, sang phải và thậm chí theo đường chéo nếu chúng ta thực hiện phép dịch x và y cùng một lúc.
Bây giờ để thực hiện các bản dịch hình ảnh, chúng tôi sử dụng hàm warpAffine của opencv, cv2.warpAffine được sử dụng để thực hiện các bản dịch này nhưng để thực hiện điều đó, chúng tôi cần một ma trận dịch.
Ma trận dịch, T = 1 0 Tx
0 1 ty
T X, T y là các hướng mà ảnh diễn ra.
Trong đó T X dịch dọc theo trục X (Ngang)
T Y là dịch chuyển dọc theo trục Y (Dọc)
# đây là một phép biến đổi affine chỉ đơn giản là thay đổi vị trí của hình ảnh # chúng tôi sử dụng cv2.warpAffine để thực hiện các phép biến đổi này. import cv2 import numpy as np image = cv2.imread ('input.jpg') # lưu trữ chiều cao và chiều rộng của chiều cao hình ảnh , width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (image, T, (width, height)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Bản dịch ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Đầu ra bảng điều khiển - (183, 275) - chiều cao và chiều rộng
- Ma trận T
]
3. Xoay hình ảnh - Quay hình ảnh
Xoay hình ảnh là quay hình ảnh về một điểm hoặc điểm ở giữa hình ảnh, cũng giống như điểm quay hoạt động giống như một trục quay.
Như trong bản dịch, chúng ta có ma trận T, có khả năng trong phép quay, chúng ta có ma trận M
Ma trận xoay, ma trận M = Cosθ -Sinθ
Sinθ Cosθ
Trong đó θ là góc quay, được đo theo hướng ngược chiều kim đồng hồ.
Ngoài ra, có một điều cần lưu ý rằng OpenCV cho phép bạn bán và xoay hình ảnh cùng một lúc bằng cách sử dụng chức năng, cv2.getRotationMatrix2D (Rotation_center_x, Rotation_center_y, góc quay, tỷ lệ)
Chúng tôi vẫn sử dụng hàm warpAffine của opencv để lấy chuyển động quay của hình ảnh nhưng thay vì ma trận dịch như trong trường hợp trước ở đây chúng tôi sử dụng ma trận xoay.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape #divide chiều cao và chiều rộng bằng 2 để xoay hình ảnh về nó xoay tâm_matrix = cv2.getRotationMatrix2D ((width / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (image, Rotated_matrix, (width, height)) cv2.imshow ('original image', image) cv2.waitKey (0) cv2.imshow ('hình ảnh được xoay ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Bây giờ hình ảnh được xoay 90 độ, nó bị cắt vì kích thước canvas, vì kích thước canvas vẫn giữ nguyên nhưng do kích thước hình ảnh xoay không vừa với kích thước canvas. Nó có thể được điều chỉnh bằng cách đặt hệ số tỷ lệ thành âm, nhưng nó cho phép nền đen phía sau hình ảnh.
Vì vậy, bạn có thể đặt chiều cao và chiều rộng của hình ảnh bằng cách đoán trước hoặc đoán nó hoặc có một phương pháp khác để xoay hình ảnh là chuyển vị nó, nhưng nó sẽ xoay hình ảnh theo bội số của 90 độ theo hướng ngược chiều kim đồng hồ.
4. Chia tỷ lệ, thay đổi kích thước và nội suy
Chia tỷ lệ và thay đổi kích thước là các phép biến đổi affine, thay đổi kích thước hình ảnh là những gì chúng tôi đã làm khá lâu và chúng tôi cũng đã xử lý nội suy, như khi bạn thay đổi kích thước hình ảnh thành kích thước lớn hơn trong đó chúng tôi đang mở rộng các pixel, có một số khoảng trống trong pixel và đó là nơi xuất hiện nội suy.
Nó có thể xảy ra khi tăng kích thước hình ảnh từ nhỏ hơn đến lớn hơn hoặc giảm kích thước hình ảnh từ lớn hơn xuống nhỏ hơn.
Về mặt kỹ thuật, nội suy là một phương pháp xây dựng các điểm dữ liệu mới (pixel), trong tập hợp các điểm dữ liệu đã biết rời rạc.
Có nhiều loại phương pháp nội suy khác nhau trong OpenCV như
cv2.INTER_AREA - tốt để thu nhỏ hoặc thu nhỏ mẫu
cv2.INTER_NEAREST - nhanh nhất
cv2.LINEAR - tốt để phóng to hoặc lấy mẫu lên (mặc định)
cv2.CUBIC - tốt hơn
cv2.INTER_LANCZOS4 - tốt nhất
# thay đổi kích thước rất dễ dàng bằng cách sử dụng hàm cv2.resize, các đối số của nó là # cv2.resize (hình ảnh, dsize (kích thước hình ảnh đầu ra), x_scale, y_scale, nội suy) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # hãy làm cho hình ảnh bằng 3/4 kích thước hình ảnh gốc, tức là tỷ lệ xuống 75% image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) # vì nội suy tuyến tính là phương pháp mặc định cho cv mở nên chúng tôi không cần triển khai nó dưới dạng một hàm. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # hãy nhân đôi kích thước của hình ảnh img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # hãy thay đổi kích thước theo kích thước chính xác image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Hình ảnh Kim tự tháp - Một cách khác để thay đổi kích thước
Hình ảnh kim tự tháp đề cập đến việc tăng tỷ lệ (phóng to hình ảnh) hoặc giảm tỷ lệ (hình ảnh thu nhỏ).
Đó chỉ đơn giản là một cách thay đổi kích thước khác cho phép chúng tôi chia tỷ lệ hình ảnh một cách dễ dàng và nhanh chóng, thu nhỏ sẽ giảm một nửa chiều cao và chiều rộng của hình ảnh mới.
Điều này rất hữu ích khi tạo ra các bộ phát hiện đối tượng để chia tỷ lệ hình ảnh mỗi khi nó tìm kiếm một đối tượng.
nhập cv2 image = cv2.imread ('input.jpg') small = cv2.pyrDown (image) large = cv2.pyrUp ( small ) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('nhỏ hơn', nhỏ hơn) cv2.waitKey (0) cv2.imshow ('lớn hơn', lớn hơn) cv2.waitKey (0) cv2.destroyAllWindows ()
Trong hình ảnh lớn hơn, bạn sẽ nhận thấy rằng vẫn có cùng kích thước với hình ảnh gốc, nó hơi mờ vì nó được chuyển đổi trực tiếp từ hình ảnh nhỏ hơn sang hình ảnh lớn hơn. Nhưng nếu chúng ta nội suy nó, chất lượng hình ảnh sẽ được cải thiện như trước vì phép nội suy ước tính các pixel trong khi lấp đầy các khoảng trống khi hình ảnh được phóng to.
Bây giờ chạy cùng một mã nhưng với nội suy khối sẽ cho chất lượng hình ảnh lớn hơn. Hình ảnh bên dưới cho thấy sự so sánh giữa hình ảnh gốc, phiên bản hình ảnh được thu nhỏ, hình ảnh nhỏ hơn và phiên bản nội suy khối của hình ảnh nhỏ hơn.
nhập cv2 image = cv2.imread ('input.jpg') small = cv2.pyrDown (image) large = cv2.pyrUp ( small ) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('nhỏ hơn', nhỏ hơn) cv2.waitKey (0) cv2.imshow ('lớn hơn', lớn hơn) cv2.waitKey (0) # tăng chất lượng của hình ảnh lớn hơn được chuyển đổi từ hình ảnh nhỏ hơn bằng cách sử dụng phép nội suy khối img_double = cv2.resize (nhỏ hơn, Không, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
Chú ý: Nếu bạn muốn tạo nhiều bản sao nhỏ của hình ảnh sẽ nhỏ hơn và kích thước nhỏ hơn hoặc nhiều bản sao lớn các hình ảnh liên tục phát triển về kích thước, sau đó chúng ta có thể sử dụng cho vòng lặp hoặc khi vòng giữ bên pyrDown hoặc pyrUp chức năng.
6. Cắt - Cắt vùng hình ảnh bạn muốn
Cắt ảnh đề cập đến việc trích xuất một đoạn hình ảnh.
OpenCV trực tiếp không có chức năng cắt xén nhưng nó có thể dễ dàng thực hiện bằng cách NumPy bằng cách sử dụng mã dưới đây
Đã cắt = hình ảnh
Chúng tôi đặt mảng hình ảnh và sử dụng các công cụ hoặc phương thức lập chỉ mục trong numpy, chúng tôi xác định hàng bắt đầu đến hàng kết thúc và cột bắt đầu đến cột kết thúc được phân tách bằng dấu phẩy trích xuất hình chữ nhật chúng ta muốn cắt để lấy hình ảnh.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # hãy lấy tọa độ pixel bắt đầu (trên cùng bên trái của hình chữ nhật cắt) start_row, start_col = int (height *.25), int (width *.25) # hãy lấy tọa độ pixel kết thúc (dưới cùng bên phải) end_row, end_col = int (height *.75), int (width *.75) # chỉ cần sử dụng lập chỉ mục để cắt hình chữ nhật mà chúng tôi muốn cắt = hình ảnh cv2.imshow ("hình ảnh gốc", hình ảnh) cv2.waitKey (0) cv2.imshow ("hình ảnh đã cắt", đã cắt xén) cv2.waitKey (0) cv2.destroyAllWindows ()
Lưu ý rằng bạn có thể sử dụng trực tiếp các giá trị pixel thay vì start_col hoặc start_row , chúng chỉ được cung cấp để người dùng dễ nhận dạng.
7. Các phép toán số học để làm sáng và tối hình ảnh
Các phép toán số học trong OpenCV về cơ bản là cộng hoặc trừ ma trận cho hình ảnh, cộng hoặc trừ ma trận có tác dụng tăng hoặc giảm độ sáng.
Vì vậy, để cộng hoặc trừ các ma trận, chúng ta phải tạo chúng và numpy có một hàm được gọi là np.ones cung cấp cho các ma trận có kích thước giống như hình ảnh của chúng ta.
import cv2 import numpy dưới dạng np image = cv2.imread ('input.jpg') # tạo ma trận của một người, sau đó nhân nó với tỷ lệ 100 ' # np.ones cho một ma trận có cùng kích thước với hình ảnh của chúng tôi với tất cả các giá trị là 100 trong trường hợp này là M = np.ones (image.shape, dtype = "uint8") * 100 # chúng tôi sử dụng điều này để thêm ma trận M này vào hình ảnh của chúng tôi # thông báo tăng độ sáng được thêm vào = cv2.add (hình ảnh, M) cv2.imshow ("Đã thêm", đã thêm) cv2.waitKey (0) # tương tự như vậy, chúng ta cũng có thể trừ # thông báo giảm độ sáng đã trừ = cv2.subtract (hình ảnh, M) cv2.imshow ("đã trừ", đã trừ) cv2.waitKey (0) cv2.destroyAllWindows ()
Đây là cách OpenCV có thể được sử dụng để áp dụng nhiều thao tác xử lý ảnh khác nhau trên ảnh. Chúng tôi sẽ tiếp tục với các chức năng thao tác hình ảnh khác trong hướng dẫn tiếp theo.