Tỷ lệ hình ảnh là một phần thiết yếu của xử lý hình ảnh. Hình ảnh cần được phóng to hoặc thu nhỏ vì nhiều lý do. Trong bài viết này, chúng ta sẽ xem xét các phương pháp chia tỷ lệ hình ảnh khác nhau và chúng ta sẽ triển khai chúng trong Python
Bài viết này là một phần của loạt bài thảo luận về khái niệm xử lý ảnh. Tham khảo các bài viết trước
- Xử lý hình ảnh và thao tác pixel. Bộ lọc ảnh
- Cách tạo ảnh ghép bằng Python
Chúng tôi sẽ giả sử rằng chúng tôi có một hình ảnh có độ phân giải width×height
mà chúng tôi muốn thay đổi kích thước thành new_width×new_height
. Đầu tiên, chúng tôi sẽ giới thiệu các hệ số tỷ lệ scale_x
và scale_y
được định nghĩa như sau
scale_x = new_width / width
scale_y = new_height / height
A scale factor 1 indicates stretching.
Chúng tôi sẽ phải nhập hình ảnh vào một mảng, tôi sẽ sử dụng PIL
cho việc này
Từ giờ trở đi, tôi sẽ chỉ nói về phần
im.resize[size, Image.NEAREST]
0Chúng tôi sẽ lấy hai ảnh này [Ảnh đầu tiên của John-Mark Smith từ Unsplash và ảnh thứ hai của Hiếu Hoàng từ Pexels] làm ví dụ. Ảnh gốc có độ phân giải
im.resize[size, Image.NEAREST]
1 [~2 Megapixel]Chúng tôi sẽ thu nhỏ những hình ảnh này xuống thành
im.resize[size, Image.NEAREST]
2 và tăng tỷ lệ lên thành im.resize[size, Image.NEAREST]
3 , hệ số tỷ lệ là im.resize[size, Image.NEAREST]
4 và im.resize[size, Image.NEAREST]
5. Điều quan trọng là không sử dụng các số đẹp, chẳng hạn như hệ số tỷ lệ là 2, 4, 0. 5, vì chúng có thể là các trường hợp cạnh khi các thuật toán đưa ra các kết quả hấp dẫn không phản ánh trường hợp chungẢnh của John-Mark Smith từ Bapt
Ảnh của Hiếu Hoàng từ Pexels
Nội suy lân cận gần nhất
Đây có lẽ là phương pháp chia tỷ lệ hình ảnh đơn giản nhất. Mỗi pixel đầu ra được thay thế bằng pixel gần nhất của nó trong đầu vào
Trong 1 chiều, giá trị tại x là giá trị của điểm gần nó nhất
Đường màu xanh là phép nội suy lân cận gần nhất của các chấm đỏ. Hình ảnh của tác giả
Trong 2D, một pixel có tọa độ [x, y] trong hình ảnh đầu ra có tọa độ [x/scale_x, y/scale_y] trong hình ảnh đầu vào. Vì các tọa độ này không phải lúc nào cũng tồn tại [nếu chúng có phần thập phân], chúng tôi sẽ làm tròn tọa độ thành số nguyên gần nhất, do đó làm tròn đến hàng xóm gần nhất
Pixel màu xanh lá cây được xấp xỉ bởi hàng xóm gần nhất của nó. Hình ảnh của tác giả
Việc thực hiện này sẽ như thế này
Kết quả
Ảnh được thu nhỏ [trái] và phóng to [phải] Ảnh của John-Mark Smith từ Bapt
Ảnh thu nhỏ [trái] và phóng to [phải] Ảnh của Hiếu Hoàng từ Pexels
Thay vào đó, bạn có thể sử dụng phương pháp
im.resize[size, Image.NEAREST]
7 của im.resize[size, Image.NEAREST]
6im.resize[size, Image.NEAREST]
Nội suy song tuyến tínhNội suy tuyến tính [a. k. một lerp] tương đương với việc vẽ một đường thẳng giữa hai điểm liên tiếp. Điều này cũng có thể được coi là lấy trung bình cộng của các điểm lân cận có trọng số theo khoảng cách của chúng
Đường màu xanh là phép nội suy tuyến tính của các chấm đỏ. Hình ảnh của tác giả
Trong 2 chiều, phép nội suy này liên quan đến 4 điểm lân cận. Nội suy tuyến tính được thực hiện trên các điểm 2 điểm trên cùng [Q11 và Q12] và 2 điểm dưới cùng [Q21 và Q22] để thu được hai điểm mới [P1 và P2]. Sau đó, phép nội suy tuyến tính được áp dụng cho các điểm mới để có được điểm nội suy P
Điểm màu xanh lá cây là phép nội suy song tuyến tính của các chấm màu đỏ. Hình ảnh của tác giả
Thực hiện điều này trong python
Ảnh được thu nhỏ [trái] và phóng to [phải] Ảnh của John-Mark Smith từ Bapt
Ảnh thu nhỏ [trái] và phóng to [phải] Ảnh của Hiếu Hoàng từ Pexels
Thay vào đó, bạn có thể sử dụng phương pháp
im.resize[size, Image.NEAREST]
7 của im.resize[size, Image.NEAREST]
6im.resize[size, Image.BILINEAR]
Nội suy song phươngTương đương 1 chiều của phép nội suy nhị phân là phép nội suy spline bậc ba
Thay vì vẽ các đường giữa các điểm, nội suy spline bậc ba vẽ các đường cong mượt mà. Những đường cong trơn này là đa thức bậc 3
Nội suy spline khối yêu cầu 4 điểm lân cận. Và 4 hệ số được tính theo điều kiện
- Đạo hàm tại 2 điểm lân cận bên trong là độ dốc giữa các điểm lân cận bên trong và các điểm lân cận bên ngoài
- Các hàng xóm bên trong phải là một phần của đường cong
Ví dụ về phép nội suy nhị phân của 4 điểm. Hình ảnh của tác giả
Các điều kiện có thể được chuyển thành các công thức bằng cách tính các đạo hàm và đặt chúng bằng các gradient và bằng cách đánh giá công thức bậc ba tại các điểm lân cận bên trong
Chúng ta có thể tính toán điều này bằng cách sử dụng hàm
im.resize[size, Image.BILINEAR]
1 của im.resize[size, Image.BILINEAR]
0Đường màu xanh là phép nội suy nhị phân của các chấm đỏ. Hình ảnh của tác giả
Trong 2D, điều này sẽ liên quan đến 16 điểm. Chúng ta sẽ thực hiện phép nội suy spline bậc ba trên 4 hàng điểm, sau đó thực hiện một phép nội suy spline bậc ba cuối cùng trên 4 điểm mới được nội suy
Minh họa phép nội suy nhị phân của Cmglee từ Wikimedia
Thực hiện thuật toán này một cách hiệu quả là rất khó. Thay vào đó, bạn có thể sử dụng phương thức
im.resize[size, Image.NEAREST]
6 của im.resize[size, Image.NEAREST]
7im.resize[size, Image.BICUBIC]
Ảnh được thu nhỏ [trái] và phóng to [phải] Ảnh của John-Mark Smith từ Bapt
Ảnh thu nhỏ [trái] và phóng to [phải] Ảnh của Hiếu Hoàng từ Pexels
lấy mẫu hộpHình ảnh của tác giả
Phương pháp này được sử dụng đặc biệt để thu nhỏ. Khi sử dụng một trong các thuật toán ở trên để thu nhỏ kích thước, một số pixel hoàn toàn bị bỏ qua. Điều này dẫn đến chất lượng thu nhỏ kém. Để khắc phục điều này, lấy mẫu hộp xem mọi pixel trong hình ảnh được thu nhỏ dưới dạng hộp trong ảnh gốc. Và màu của nó là trung bình cộng của các màu bên trong hộp
Hình ảnh được thu nhỏ lại bằng cách sử dụng lấy mẫu hộp. Ảnh của John-Mark Smith từ Bapt [trái] Ảnh của Hiếu Hoàng từ Pexels [phải]
Thay vào đó, bạn có thể sử dụng phương pháp
im.resize[size, Image.NEAREST]
7 của im.resize[size, Image.NEAREST]
6im.resize[size, Image.BOX]
Có các thuật toán chia tỷ lệ hình ảnh khác như lấy mẫu lại Sinc và Lanczos hoặc thuật toán dựa trên mạng thần kinh tích chập sâu, nhưng chúng phức tạp hơn một chút
Tỷ lệ hình ảnh là một phần quan trọng của xử lý hình ảnh. Trong bài viết này, tôi chỉ thảo luận về các thuật toán chia tỷ lệ đơn giản và nguyên tắc đằng sau chúng cho hình ảnh. Các thuật toán mở rộng video theo thời gian thực thường được thực hiện trên phần cứng [GPU] để có hiệu suất nhanh hơn