Cách chọn roi trong xử lý ảnh

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

Cách chọn roi trong xử lý ảnh

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

Cách chọn roi trong xử lý ảnh

  • 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:

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ả:

Cách chọn roi trong xử lý ảnh

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é :).


Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!

  • Minh: https://www.facebook.com/minhng.info
  • Khám phá xử lý ảnh - GVGroup: https://www.facebook.com/groups/ip.gvgroup

Khám phá xử lý ảnh - GVGroup

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

  • Hashtag #OpenCV
  • Tut 1: Xử lý ảnh - OpenCV đọc ghi hình ảnh (code Python và C++)
  • Tut 1.1: Xử lý ảnh - Cấu trúc dữ liệu ảnh trong OpenCV. Pixel là gì?
  • Tut 1.2: Xử lý ảnh - Chuyển đổi ảnh OpenCV sang Pillow và ngược lại
  • Tut 2: Xử lý ảnh - OpenCV resize, crop và padding hình ảnh (code Python và C++)
  • Tut 3: Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh (code Python)
  • Tut 4: Xử lý ảnh - OpenCV vùng quan tâm (ROI) là gì? (code Python)
  • Tut 4.1: Xử lý ảnh - OpenCV: vẽ văn bản, đường thẳng, mũi tên, hình chữ nhật, hình tròn, ellipse, đa giác
  • Tut 4.2: Xử lý ảnh - Pha trộn ảnh trong OpenCV (blending)
  • Tut 5: Xử lý ảnh - OpenCV ảnh nhị phân
  • Tut 6: Xử lý ảnh - OpenCV cân bằng sáng (histogram equalization)
  • Tut 7: Xử lý ảnh - OpenCV kỹ thuật cửa sổ trượt (sliding window)
  • Tut 8: Xử lý ảnh - Convolution là gì?
  • Tut 9: Xử lý ảnh - Làm mờ ảnh (blur)
  • Tut 10: Xử lý ảnh - Gradient của ảnh là gì?
  • Tut 11: Xử lý ảnh - Phát hiện cạnh Canny (Canny Edge Detection)
  • Tut 12: Xử lý ảnh - Phát hiện đường thẳng bằng Hough Transform (Hough Line)
  • Tut 13: Xử lý ảnh - Hiện thực phát hiện đoạn thẳng dùng Hough Transform (Hough Line)
  • Tut 14: Xử lý ảnh - Giải thuật phân vùng Region Growing trên ảnh màu
  • Tut 15: Xử lý ảnh - Giải thuật Background Subtraction trên ảnh màu
  • Tut 16: Xử lý ảnh - Frame Subtraction để phát hiện chuyển động trong video
  • Tut 17: Xử lý ảnh - HOG - Histograms of Oriented Gradients
  • Tut 18: Xử lý ảnh - HOG - Huấn luyện mô hình phân loại người
  • Tut 19: Xử lý ảnh - HOG - Phát hiện người
  • Tut 20: Xử lý ảnh - Tổng hợp kinh nghiệm xử lý ảnh (End)
  • Tut 21: Xử lý ảnh - Hiện thực trích đặc trưng Local Binary Patterns (LBP)
  • Tut 22: Xử lý ảnh - Trích đặc trưng Gabor filters