Xử Lý Ảnh Cơ Bản Với OpenCV Trong Python (P1)

Xử Lý Ảnh Cơ Bản Với OpenCV Trong Python (P1)

Chắc hẳn các bạn thường hay nghe đến OpenCV để xử lý hình ảnh và được sử dụng rất phổ biến. Trong bài viết hôm nay, mình sẽ chia sẻ cho các bạn các sử dụng OpenCV cho người mới bắt đầu chưa có chút kinh nghiệm nào liên quan để xử lý ảnh nhé.

Giới thiệu OpenCV

OpenCV là dự án bắt đầu tại hãng Intel vào năm 1999 bởi Gary Bradsky và ra mắt lần đầu tiên vào năm 2000. Sau đó Vadim Pisarevsky gia nhập và quản lý nhóm. Vào năm 2005, OpenCV được sử dụng trên xe tự lái Stanley và chiếc này đã vô địch giải đấu  2005 DARPA Grand. Tiếp theo nó tiếp tục được cải tiến và phát triển dưới sự hỗ trợ của Willow Garage bên cạnh với Gary Bradsky và Vadim Pisarevsky. Hiện tại OpenCV hỗ trợ vô số các thuật toán liên quan để lĩnh vực thị giác máy tính (computer vision) và lĩnh vực học máy (machine learning).

OpenCV có thể sử dụng được ở hầu hết các ngôn ngữ như C++, Python, Java … và các hệ điều hành khác nhau như Windows, Linux, OS X, Android, iOS. Ngoài ra nó thể sử dụng card đồ họa GPU để xử lý nhằm tốc độ xử lý.

Trong bài viết này mình sẽ sử dụng ngôn ngữ Python để thực hiện các ví dụ do ngôn ngữ này có cú pháp đơn giản, dễ hiểu và cấu hình môi trường đơn giản

1. Cài đặt môi trường

Trong bài viết này mình sử dụng python 3 với thư viện opencv-python phiên bản 4.2.0.34.

Ở đây để đơn giản cho việc cài đặt thì chúng ta sử dụng một thư viện có sẵn trên kho quản lý gói của python là opencv-python. Đây là một thư viện không phải của tổ chức OpenCV tuy nhiên nó có tính năng y hệt và được cập nhật thường xuyên theo sự thay đổi của OpenCV. Hay nói cách khác đây là một đóng gói cho OpenCV trên kho thư viện của python. Nếu bạn muốn sử dụng opencv phiên bản gốc thì lên trang sourceforge.net chọn phiên bản rồi tải xuống. Tiếp theo là giải nén và cài đặt bằng tay theo hướng dẫn. Vì cách cài đặt này để cái đặt cho nhiều ngôn ngữ khác nhau nên cách này không khuyến khích cho người vừa bắt đầu sử dụng opencv.

Sử dụng đoạn lênh sau để cài đặt gói từ kho thư viện pip

pip install opencv-python

Để kiểm tra cài đặt thành công hay không ta thực hiện đoạn lênh sau để kiểm tra phiên bản của opencv-python. Tùy từng thời điểm thì phiên bản của gói sẽ khác nhau. Các phiên bản mới là cập nhật cho opencv mới hơn.

import cv2
print(cv2.__version__)

2. Hiển thị hình ảnh

Đầu tiên ta tạo một đối tượng chứa thông tin ảnh được tải lên từ file. Sau đó hiện thị hình ảnh lên cửa sổ giao diện.

img = cv2.imread('digital-neon.jpg')

cv2.imshow('Display Image', img)
cv2.waitKey(0)


Ở đây digital-neon.jpg là file hình ảnh để test, hàm waitKey(0) là hàm chờ không cho thoát cửa sổ lập tức mà phải người dùng nhấn phím bất kỳ để thoát.

3. Lấy kích thước của ảnh

img = cv2.imread('digital-neon.jpg')
(h, w, d) = img.shape
print("width={}, height={}, depth={}".format(w, h, d))

Output: width=580, height=326, depth=3

Ở đây biến img là một đối tượng của Numpy array chứa giá trị màu của từng điểm ảnh trên các không gian màu khác nhau. Lệnh img.shape để lấy ra kích thước của mảng này với h, w, d lần lượt là chiều cao, chiều rộng, độ sâu của bước ảnh. Với ảnh có màu thì độ sau thường là 3, ảnh đen trắng là 1.

4. Lấy giá trị màu ở một điểm ảnh

Đoạn lệnh sau lấy ra giá trị màu ở điểm ảnh tại vi trí 50, 50 với gốc tọa độ là điểm trên cùng bên trái hình ảnh.

(B, G, R) = img[50, 50]
print("R={}, G={}, B={}".format(R, G, B))
output: R=96, G=100, B=111

Giá trị các thành phần màu có giá trị từ 0 đên 255.

5. Cắt ảnh

Đoạn lệnh sau cắt ảnh có tọa độ điểm trên cùng bên trái là (50, 60) và tọa độ điểm dưới cùng bên phải là (350, 360).

roi = img[50:350, 60:360]
cv2.imshow('Region Of Interest', roi)
cv2.waitKey(0)

6. Thay đổi kích thước ảnh

Để thay đổi kích thước của ảnh trong opencv thì chúng ta sẽ dùng hàm resize. Hàm này cần xác định rõ chiều cao, chiều rộng ảnh sau khi biến đổi. Tuy nhiên ảnh sau khi thay đổi thường cùng tỷ lệ chiều cao, chiều rộng với ảnh gốc. Đoạn lệnh sau biến đối ảnh gốc có chiều rộng 580 pixel sang ảnh có chiều rộng là 300 pixel.

img = cv2.imread('digital-neon.jpg')

(h, w, d) = img.shape

r = 300.0 / w dim = (300, int(h * r))

resized = cv2.resize(img, dim)

7. Xoay ảnh

Để xoay được ảnh đầu tiên ta cần xác định gốc xoay và hướng xoay. Sau khi xác định xong tiếp theo ta tính ma trận xoay bằng hàm getRotationMatrix2D trong opencv. Cuối cùng ta nhân ma trận này với ma trận ảnh gốc ta được ảnh sau khi xoay.

Đoạn lệnh dưới đây xoay ảnh một góc 45 theo chiều ngược kim đồng hồ với gốc xoay là điểm chính giữa hình ảnh.

img = cv2.imread('digital-neon.jpg') 
(h, w, d) = img.shape 
center = (w // 2, h // 2) 
M = cv2.getRotationMatrix2D(center, 45, 1.0) 
rotated = cv2.warpAffine(img, M, (w, h))


Tạm kết

Với vài chức năng cơ bản để xử lý ảnh ở bài viết này bạn có thể làm được một ứng dụng đơn giản để chỉnh sửa ảnh với OpenCV. Trong các phần tiếp theo, mình sẽ giới thiệu thêm các chức năng xử lý ảnh mạnh hơn như xác định biên của các đối tượng trong ảnh, tính số đối tượng trong ảnh, loại bỏ nhiễu, xác đinh người trong ảnh …