Xử lý một phần hình ảnh bằng ROI

Xử lý ảnh thường người ta chỉ xử lý 1 phần của ảnh chứ ít khi xử lý toàn bộ. Nhận diện khuôn mặt thì chỉ lấy vùng chứa khuôn mặt, xử lý biển số người ta crop biển số. Và vùng cần lấy ra đó là ROI – region of interest.

C++ có con trỏ rất hay, nó quản lý bộ nhớ RAM hiệu quả, làm giảm việc cấp phát và thu hồi bộ nhớ. Do đó sử dụng con trỏ sẽ giúp chương trình xử lý nhanh hơn. Nếu bạn hiểu con trỏ thì xử lý một phần hình ảnh bằng ROI cũng tương tự mà thôi


Trong bài này sử dụng ảnh bên dưới để làm ví dụ
600_c23e04ed-9fa6-4840-ab70-a8af87834884

Thực hành

Trong opencv, ảnh là ma trận, và ROI cũng là ma trận được quản lý bởi con trỏ. Code dưới đây tạo ROI là hình vuông size 100 ở vị trí (0; 0)

Gán giá trị 0 cho ROI thì ảnh gốc như sau

Ta thấy được vùng được chọn đã thành màu đen (giá trị 0)
matroi

Tương tự như vậy, gán 1 màu nào đó cho roi

matroi2

Hoặc gán bằng 1 vùng ảnh khác, code bên dưới gán bằng hình vuông size 100 tại vị trí (200,200). Lưu ý không gán trực tiếp được mà phải xài hàm copyTo()

matroi3

Kết luận

Dùng ROI cũng giống như crop ảnh, tuy nhiên khác ở chỗ dùng ROI quản lý bộ nhớ tốt hơn. Không phải tạo vùng nhớ mới chứa ảnh đã crop nên tốc độ xử lý sẽ nhanh hơn crop ảnh. Đồng thời cũng dễ xử lý với những yêu cầu như blend ảnh hoặc các tính toán phức tạp khác.

Leave a Reply