Phần 2. Đọc, hiển thị và ghi ảnh bằng OpenCV

0
10410

Đọc, hiển thị và ghi hình ảnh là những thao tác cơ bản nhất trong xử lý ảnh và thị giác máy tính. Để có thể thực hiện bất cứ thuật toán hoặc bộ lọc nào trong xử lý ảnh thì đầu tiên cần phải đọc được ảnh đó. Chính vì vậy việc nắm được 3 thao tác cơ bản trên có vai trò rất quan trọng.

Bài viết này sẽ hướng dẫn cách sử dụng thư viện OpenCV để đọc, hiển thị và ghi ảnh bằng cả C++ và Python. (Nếu bạn chưa cài đặt OpenCV thì có thể tham khảo link ở phần trước).

1. Đọc ảnh đầu vào

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

3. Ghi hình ảnh

Trước tiên chúng ta sẽ xem code thực hiện cả 3 chức năng cơ bản trên.

Python

# import the cv2 library
import cv2

# The function cv2.imread() is used to read an image.
img_grayscale = cv2.imread('test.jpg',0)

# The function cv2.imshow() is used to display an image in a window.
cv2.imshow('graycsale image',img_grayscale)

# waitKey() waits for a key press to close the window and 0 specifies indefinite loop
cv2.waitKey(0)

# cv2.destroyAllWindows() simply destroys all the windows we created.
cv2.destroyAllWindows()

# The function cv2.imwrite() is used to write an image.
cv2.imwrite('grayscale.jpg',img_grayscale)

C++

//Include Libraries
#include<opencv2/opencv.hpp>
#include<iostream>

// Namespace nullifies the use of cv::function(); 
using namespace std;
using namespace cv;

// Read an image 
Mat img_grayscale = imread("test.jpg", 0);

// Display the image.
imshow("grayscale image", img_grayscale); 

// Wait for a keystroke.   
waitKey(0);  

// Destroys all the windows created                         
destroyAllWindows();

// Write the image in the same directory
imwrite("grayscale.jpg", img_grayscale);

Để sử dụng được OpenCV chúng ta đầu tiên cần khai báo thư viện:

Python

# import the cv2 library
import cv2

Trong C++, sử dụng #include để thực hiện khai báo thư viện. Ngoài ra việc chỉ định rõ namespaces cho phép tham chiếu trực tiếp đến các hàm. Ví dụ thay vì cv::imread(), thì có thể sử dụng trực tiếp read().

C++

//Include Libraries
#include<opencv2/opencv.hpp>
#include<iostream>

// Namespace nullifies the use of cv::function(); 
using namespace std;
using namespace cv;

1. Đọc ảnh đầu vào

Để đọc ảnh đầu vào, sử dụng hàm imread() của OpenCV. Cú pháp:

imread(filename, flags)

Hàm có 2 đối số:

– Đối số đầu tiên là tên ảnh đầu vào, yêu cầu cần phải có đường dẫn đầy đủ đến tệp chứa ảnh.

– Đối số thứ hai là một cờ tùy chọn cho phép bạn chỉ định hình ảnh sẽ được thể hiện như thế nào. OpenCV cung cấp một số tùy chọn cho cờ này. Các tùy chọn phổ biến nhất bao gồm:

+ cv2.IMREAD_UNCHANGED or -1
+ cv2.IMREAD_GRAYSCALE or 0
+ cv2.IMREAD_COLOR or 1

Giá trị mặc định cho cờ là 1, giá trị này sẽ đọc trong hình ảnh dưới dạng ảnh có màu. Khi bạn muốn đọc hình ảnh ở một định dạng cụ thể, chỉ cần chỉ định cờ thích hợp.

Cần lưu ý OpenCV đọc hình ảnh màu ở định dạng BGR, trong khi hầu hết các thư viện thị giác máy tính khác sử dụng định dạng kênh RGB. Vì vậy, khi sử dụng OpenCV với các bộ công cụ khác, cần có sự chuyển đổi kênh màu để đảm bảo hình ảnh không bị sai lệch màu. Code dưới đây sẽ sử dụng tất cả ba giá trị cờ được mô tả ở trên để thực hiện đọc ảnh đầu vào:

Python

# Read an image
img_color = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
img_grayscale = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE)
img_unchanged = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)

C++

// Read an image 
Mat img_color = imread("test.jpg", IMREAD_COLOR);
Mat img_grayscale = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_unchanged = imread("test.jpg", IMREAD_UNCHANGED);

Hoặc

Python

img_color = cv2.imread('test.jpg',1)
img_grayscale = cv2.imread('test.jpg',0)
img_unchanged = cv2.imread('test.jpg',-1)

C++

Mat img_color = imread("test.jpg", 1);
Mat img_grayscale = imread("test.jpg", 0);
Mat img_unchanged = imread("test.jpg", -1);

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

Trong OpenCV, hàm imshow() được dùng để hiển thị hình ảnh. Cú pháp:

imshow(window_name, image)

Hàm này cũng gồm 2 đối số:

– Đối số đầu tiên là tên cửa sổ sẽ được hiển thị

– Đối số thứ 2 là ảnh cần hiển thị

Để hiển thị nhiều hình ảnh cùng một lúc, cần định rõ từng tên từng cửa sổ tương ứng cho từng ảnh cần được hiển thị.

Hàm imshow() được xây dựng để sử dụng cùng với các hàm waitkey() và destroyAllWindows()/destroyWindow().

Hàm waitKey () là một hàm liên kết bàn phím.

– Hàm có một đối số duy nhất, đó là thời gian (tính bằng mili giây), mà cửa sổ sẽ được hiển thị.

– Nếu người dùng nhấn bất kỳ phím nào trong khoảng thời gian này, chương trình sẽ tiếp tục.

– Nếu 0 được thông qua, chương trình sẽ chờ vô thời hạn một lần gõ phím.

– Ta có thể cài đặt để phát hiện việc nhấn phím cụ thể như Q hoặc ESC, từ đó xác định rõ phím nào sẽ kích hoạt hành vi tương ứng nào.

Hàm destroyAllwindows() sẽ hủy tất cả các cửa sổ đã tạo. Nếu cần hủy một cửa sổ cụ thể, thì đặt tên cửa sổ đó làm đối số. Sử dụng hàm này cũng xóa cửa sổ hoặc hình ảnh khỏi bộ nhớ chính của hệ thống.

Python

#Displays image inside a window
cv2.imshow('color image',img_color)  
cv2.imshow('grayscale image',img_grayscale)
cv2.imshow('unchanged image',img_unchanged)
# Waits for a keystroke
cv2.waitKey(0)  
# Destroys all the windows created
cv2.destroyAllwindows() 

C++

// Create a window.
namedWindow( "color image", WINDOW_AUTOSIZE );
namedWindow( "grayscale image", WINDOW_AUTOSIZE );
namedWindow( "unchanged image", WINDOW_AUTOSIZE );
// Show the image inside it.
imshow( "color image", img_color ); 
imshow( "grayscale image", img_grayscale );
imshow( "unchanged image", img_unchanged ); 
// Wait for a keystroke.
waitKey(0);  

// Destroys all the windows created                         
destroyAllWindows();

Kết quả:

Nếu không có hàm waitKey () thì các cửa sổ ảnh sẽ bị xóa trong vòng mili giây và ta sẽ cảm giác không có đầu ra nào được hiển thị trên màn hình.

3. Ghi hình ảnh

Để ghi hình ảnh vào một thư mục nào đó thì sử dụng hàm imwrite(). Cú pháp của hàm như sau:

imwrite(filename, image)

– Đối số đầu tiên là tên tệp, phải bao gồm phần mở rộng tên tệp (ví dụ: .png, .jpg, v.v.). OpenCV sử dụng phần mở rộng tên tệp này để chỉ định định dạng của tệp.

– Đối số thứ hai là hình ảnh bạn muốn lưu. Hàm trả về giá trị True nếu ảnh được lưu thành công.

Python

cv2.imwrite('grayscale.jpg',img_grayscale)

C++

imwrite("grayscale.jpg", img_grayscale);

Như vậy bài viết đã hướng dẫn các nội dung cơ bản sau:

– Hàm imread (), imshow () và imwrite () để đọc, hiển thị và ghi hình ảnh

– Các hàm waitKey () và DestAllWindows (), cùng với hàm hiển thị để:

+ Đóng cửa sổ hình ảnh khi nhấn phím

+ Xóa mọi cửa sổ hình ảnh đang mở khỏi bộ nhớ

Ở bài viết tiếp theo, chúng ta sẽ cùng tìm hiểu một số thao tác cơ bản xử lý video với OpenCV.

Biên dịch: Thảo Nguyễn

Để cập nhật tin tức công nghệ mới nhất và các sản phẩm của công ty AIoT JSC, vui lòng truy cập link: http://aiots.vn hoặc linhkienaiot.com

5 1 Bỏ phiếu
Article Rating
Subscribe
Notify of
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả các bình luận