Xử lý ảnh - OpenCV vùng quan tâm (ROI) là gì? (code Python)

  Oct 9, 2018      2m
   

OpenCV - tut 4

Xử lý ảnh - OpenCV vùng quan tâm (ROI) là gì? (code Python)

Môi trường làm việc với OpenCV

  • Linux (bài viết sử dụng Ubuntu 16.04)
  • OpenCV (bài viết sử dụng OpenCV 3.4.1)
  • Python (bài viết sử dụng Python 3.5.5)
  • Ảnh mẫu để xử lý (bài viết sử dụng ảnh img_4.jpg)

img_4.jpg

Anh girl xinh 4 opencv

Bạn có thể download ảnh mẫu về.

Định nghĩa vùng quan tâm (ROI)

Vùng quan tâm (Region Of Interest, viết tắt ROI hoặc RoI) là vùng ảnh ta sẽ áp dụng các xử lý / biến đổi trên đó và bỏ qua các vùng còn lại.

Đôi khi không phải lúc nào ta cũng có thể xử lý trên toàn ảnh. Thử tưởng tượng với 1 ảnh có kích thước 1024x1024 thì ta đã có hơn 1 triệu điểm ảnh phải xử lý. Do đó, để tiết kiệm chi phí tính toán, ta thu hẹp vùng quan tâm từ toàn ảnh về 1 vùng diện tích nhỏ hơn chỉ là 1 phần của ảnh gốc.

Với cách làm này giúp cải thiện hiệu suất tính toán. Đôi khi đây cũng là 1 mẹo trong xử lý ảnh nếu ta áp dụng nó một cách hợp lý!

Vùng quan tâm (ROI) trong xử lý ảnh

  • ROI có thể ở bất cứ hình dạng nào, có thể là hình vuông, hình chữ nhật, hình tròn, nhiều vùng nhỏ trên ảnh hoặc thậm chí là các pixel trên ảnh.
  • ROI là một MẶT NẠ mà trên đó: pixel quan tâm có giá trị 1 (màu trắng) và pixel không quan tâm có giá trị zero.
  • Vùng không quan tâm trên ảnh thường là BACKGROUND (ảnh nền).
  • Áp dụng ROI lên ảnh ta lấy ảnh gốc nhân với mặt nạ ROI.

ROI được mô tả dữ dội quá, hãy cùng Minh xem qua ảnh minh họa của ROI nhé:

ROI.png

sample ROI

  • Màu trắng thể hiện vùng ảnh ta quan tâm, cần sẽ xử lý.
  • Màu đen là vùng ta KHÔNG QUAN TÂM, không xử lý hoặc bỏ đi.
  • Mặt nạ ROI là ma trận những giá trị 0, 1 (nhị phân), do đó để trực quan hóa thành hình ảnh như hình trên, điểm không cần phải nói ra là ta scale về miền giá trị [0, 255] cho hiển thị!!

Áp dụng ROI vào ảnh với OpenCV

Đoạn chương trình trên cho phép ta áp dụng vùng quan tâm vào ảnh. Tổ chức thư mục:

- opencv_ROI.py
- img_4.jpg
- ROI.png

Các bước xử lý ảnh của chương trình bên dưới:

  • Resize ROI bằng với kích thước ảnh cần xử lý: Tut 2: OpenCV resize, crop và padding hình ảnh (code Python và C++).
  • Biến đổi ROI về ảnh nhị phân (0 và 1) bằng cách lọc theo ngưỡng có giá trị 128 (>= 128 thì pixel có giá trị 1, < 128 thì pixel có giá trị 0).
  • Áp dụng ROI lên ảnh bằng phép nhân từng phần tử (element-wise).

opencv_ROI.py

import os, sys
import cv2

def apply_roi(img, roi):
    # resize ROI to match the original image size
    roi = cv2.resize(src=roi, dsize=(img.shape[1], img.shape[0]))
    
    assert img.shape[:2] == roi.shape[:2]
    
    # scale ROI to [0, 1] => binary mask
    thresh, roi = cv2.threshold(roi, thresh=128, maxval=1, type=cv2.THRESH_BINARY)
    
    # apply ROI on the original image
    new_img = img * roi
    return new_img

if __name__ == "__main__":
    assert len(sys.argv) == 3, '[USAGE] $ python opencv_ROI.py input_image roi_image'
    input_image_path, roi_image_path = sys.argv[1], sys.argv[2]
    
    assert os.path.isfile(input_image_path), 'Image not found @ %s' % input_image_path
    assert os.path.isfile(roi_image_path), 'ROI not found @ %s' % roi_image_path
    
    img = cv2.imread(input_image_path)       # shape: (588, 586, 3)
    roi = cv2.imread(roi_image_path)         # shape: (300, 300, 3)
    
    new_img = apply_roi(img, roi)
    
    cv2.imwrite('new_%s' % os.path.basename(input_image_path), new_img)

Thực thi lệnh:

$ python opencv_ROI.py img_4.jpg ROI.png

để được ảnh kết quả:

roi result

Hãy thử dùng Paint tạo các ảnh ROI có vùng đen trắng và chạy lại chương trình với ảnh ROI để thực hành nhé :).


Sẽ có series các bài tiếp theo về dùng thư viện OpenCV trong xử lý ảnh, các bạn nhớ like trang Facebook để đón xem thông báo bài viết mới nhé! : https://www.facebook.com/minhng.info

Danh sách bài viết series OpenCV: