+3

Làm quen với OpenCV: Đọc, hiển thị và lưu ảnh

Xin chào các bạn, hôm nay mình sẽ giới thiệu các bạn về thư viện Opencv2, 1 thư viện rất mạnh hay sử dụng trong xử lý ảnh, đây cũng chính là thư viện mình sử chủ yếu code trong các bài tiếp theo. Và ở đây mình sẽ code bằng ngôn ngữ python 3 trên môn trường jupyter notebook.

Setup

Mình khuyến khích các bạn sử dụng anaconda ở đó sẽ có jupyter notebook, cách settup bạn có thể tham khảo đường link sau đây.

Cài đặt thư viện opencv2:

pip install opencv-python

Kiểm tra version:

import cv2
cv2.__version__
#'4.1.1'

Hoặc nếu bạn không muốn mất thời gian bạn có thể sử dụng colab

Read and display image

Ảnh mình sẽ dùng sẽ là ảnh như sau:

iname = 'lena.jpg'
#read image
img = cv2.imread(iname)
img

Đầu ra của img lúc này sẽ là 1 ma trận ba chiều nhưng trong phần lý thuyết RGB. Chúng ta sẽ có câu lệnh xem shape và size của ảnh:

img.shape()
# output: (512, 512, 3)
img.size
# output: 786432

Khi display ảnh thì có 2 cách:

  • Cách 1 dùng hàm có sẵn trong cv2:

    # cv2.imshow(window_name, image)
    cv2.imshow('test', img)
    
  • Cách 2 dùng thư viện matplotlib.

    #to display at jupyter notebook
    import matplotlib.pyplot as plt
    #Note cv2 read BGR as default
    plt.imshow(image)
    

    Nếu code như trên thì ảnh đầu ra sẽ như sau:

    Bởi vì cv2 mặc định đọc ảnh màu theo thứ là BGR (là blue, green và red). VÌ vậy muốn display đúng ta phài viết:

    #display rgb image
    plt.imshow(image[:,:,::-1])
    

Accessing image data with numpy.array

Các phép toán ta quen thuộc sử dụng trên numpy cũng được sử dụng trong image data. ví dụ:

img[0,0] 
#output: array([128, 138, 225], dtype=uint8)

Crop ra 1 phần trong ảnh và display chúng:

#crop image
crop = img[100:300, 100:300]
plt.imshow(crop[:,:,::-1])

Kết quả:

Chuyển màu vùng ta vừa crop thành màu xanh:

copy = img.copy()
copy[100:300, 100:300] = [255, 0, 0] #assign blue color
plt.imshow(copy[:,:,::-1])

Kết quả:

Resizing images

Ta muốn resize lại ảnh trên thành ảnh có kích thước 200, 200 sẽ làm như sau:

h, w = image.shape[:2]
resized = cv2.resize(image, (200, 200))
plt.imshow(resized[:,:,::-1])

Write images

Lưu file ảnh ta dùng câu lệnh sau:

# cv2.imwrite(filename, image)
cv2.imwrite("test.jpg", resized)

Tổng kết

Tất cả code bạn có thể xem chi tiết tại đây: đây

Trên đây mình đã giới thiệu với các bạn về cách đọc, display và lưu một file ảnh


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.