Search…

Xử Lý Ảnh với OpenCV: Phóng To, Thu Nhỏ và Xoay Ảnh

15/09/20206 min read
Hướng dẫn phóng to, thu nhỏ, xoay và làm nghiêng (Skew) hình ảnh với phép biến dạng (Shearing) trong OpenCV.

Giới thiệu

OpenCV (Open Computer Vision) là một thư viện mã nguồn mở chuyên dùng để xử lý các vấn đề liên quan đến thị giác máy tính. Nhờ một hệ thống các giải thuật chuyên biệt, tối ưu cho việc xử lý thị giác máy tính, vì vậy tính ứng dụng của OpenCV là rất lớn.

Xử lý ảnh là quá trình xử lý, thao tác hình ảnh để có một hình ảnh khác phù hợp với nhu cầu của người dùng, ...

Bài viết hướng dẫn phóng to, thu nhỏ, xoay hình ảnh và làm nghiêng (Skew) một tấm ảnh với phép biến dạng (Shearing).

Các phép biến đổi 2D

Là các phép ánh xạ tọa độ điểm hay vector thành điểm hay vector khác, bản chất của phép biến đổi hình học là thay đổi vị trí của đối tượng, làm thay đổi đối tượng về hướng, kích thước, hình dạng.

Hai phương pháp để biến đổi hình học:

  1. Biến đổi đối tượng: thay đổi tọa độ của đối tượng.
  2. Biến đổi hệ tọa độ: tạo hệ tọa độ mới và tất cả đối tượng sẽ được chuyển về hệ tọa độ mới.

Phép biến đổi Affine

Là phép biến đổi tọa độ điểm đặc trưng của đối tượng thành tập tương ứng với các điểm mới để tạo ra hiệu ứng cho toàn đối tượng.

Ví dụ: Phép biến đổi tọa độ với 2 điểm đầu cuối của đoạn thẳng tạo thành 2 điểm mới mà khi nối chung lại với nhau sẽ tạo thành đoạn thẳng mới.

Phép biến đổi Affine với f(x,y)g(x,y) là 2 hàm tuyến tính:

ss_1

Biểu diễn phép biến đổi Affine dưới dạng ma trận:

ss_2

Các thuộc tính của phép biến đổi Affine

Bảo toàn đoạn thẳng

  • Các đoạn thẳng được bảo toàn, do đó ánh xạ của một đoạn thẳng vẫn là một đoạn thẳng.
  • Đơn giản hóa quá trình vẽ đoạn thẳng. Chỉ cần xác định ánh xạ của hai điểm đầu cuối của đoạn thẳng và vẽ một đường thẳng nối hai điểm đó lại.
  • Bảo đảm sự thẳng hàng, do đó các đa giác sẽ biến đổi thành các đa giác.

Bảo toàn tính song song

  • Các đoạn thẳng song song sẽ biến đổi thành các đoạn thẳng song song. Ví dụ: Hình bình hành sẽ biến đổi thành hình bình hành.

Bảo toàn các khoảng cách tỷ lệ

  • Các tỷ lệ sẽ được bảo toàn. Ví dụ: Trung điểm của đoạn thẳng sau khi biến đổi sẽ là trung điểm của đoạn thẳng mới.

Các phép biến đổi cơ sở

Các phép biến đổi cơ sở bao gồm:

  • Tịnh tiến (Translation).
  • Quay (Rotation).
  • Tỷ lệ (Scaling).
  • Biến dạng (Shearing).

Phép tịnh tiến (Translation)

Dùng để dịch chuyển đối tượng từ vị trí này sang vị trí khác.

ss_3

Gọi tr = (trx , try) là vector tịnh tiến từ điểm P đến điểm Q thì:

ss_4

Ma trận biến đổi của phép tịnh tiến.

ss_5

Phép quay (Rotation)

Là phép biến đổi nhằm thay đổi hướng của đối tượng. Một phép quay (Rotation) cần phải có:

  • Tâm quay.
  • Góc quay. Quy ước chiều dương là ngược chiều kim đồng hồ.

Phép biến đổi tỷ lệ (Scaling)

Là phép biến đổi giúp co giãn đối tượng.

ss_8

sxsy được gọi là hệ số co giản theo trục Ox và trục Oy:

  • sy = 1 thì đối tượng co giãn theo trục Ox.
  • sx = 1 thì đối tượng co giãn theo trục Oy.
  • sy = sy thì gọi đây là phép biến đổi đồng dạng (Uniform scaling), bảo toàn tính cân xứng của đối tượng. 
  • sx = sy < 1 thì đây là phép thu nhỏ, ngược lại thì đây là phép phóng to.

Phép biến đổi tỷ lệ (Scaling) thu nhỏ đối tượng sẽ làm cho đối tượng lại gần gốc tọa độ (0,0) hơn. Với phép biến đổi tỷ lệ (Scaling) phóng lớn đối tượng sẽ làm cho đối tượng xa gốc tọa độ (0,0) hơn.

Phép biến dạng (Shearing)

Là phép biến đổi thay đổi hình dạng của đối tượng.

Phép biến dạng theo trục x làm thay đổi hoành độ còn tung độ giữ nguyên.

ss_9

Phép biến dạng theo trục y làm thay đổi tung độ còn hoành độ giữ nguyên.

Phép biến đổi dạng tổng quát.

ss_11

Chú ý: Các ma trận của phép biến đổi được giới thiệu ở trên đều trong hệ tọa độ thuần nhất.

Phóng to, thu nhỏ, xoay hình ảnh với OpenCV

Ảnh số là một ma trận điểm ảnh (Pixel), được lưu trữ bởi kiểu dữ liệu cv::Mat (thực chất là một ma trận). Vậy nên, để phóng to, thu nhỏ, hay xoay chỉ cần các thuật toán dựa trên ma trận.

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;
using namespace std;

int main()
{
    Mat imageSrc = imread("stdio.png"); 
    Mat imageDst = imageSrc.clone(); // Sao chép hai ma trận.
    
    double angle = 45.0;
    double scale = 1.5;
    Point2f center(imageSrc.cols/2, imageSrc.rows/2);
    
    Mat matRot = getRotationMatrix2D(center, angle, scale);
    warpAffine(imageSrc, imageDst, matRot, imageSrc.size());

    imshow("imageSrc", imageSrc);
    imshow("imageDst", imageDst);

    waitKey(0);
    return 0;
}

Hàm cv::getRotationMatrix2D(cv::Point2f center, double angle, double scale) sẽ tạo ra một ma trận với:

  • Tâm quay center.
  • Góc quay angle.
  • Tỷ lệ phóng thu, thu nhỏ của hình ảnh scale.

Phép quay một góc α quanh tâm bất kỳ

Chứng minh phép quay tâm C(xc, yc) một góc α là kết hợp của các phép biến đổi sau đây:

  • Tịnh tiến theo vector (-xc,-yc) để dịch chuyển tâm quay về gốc tọa độ: P’ = T(-xc, -yc) . P
  • Quay quanh gốc tọa độ một góc α: Q’ = T(α) . P’
  • Tịnh tiến theo vector (xc,yc) để đưa tâm quay về vị trí ban đầu: Q = T(xc,yc) . Q’

Kết hợp 3 phép biến đổi trên được: Q = T(xc,yc).T(α).T(-xc,-yc).P. Như vậy, ma trận biến đổi của phép quay tâm bất kì là: 

ss_12

Với ma trận tính toán trong OpenCV để có thể vừa phóng lớn hay thu nhỏ tỷ lệ (scale) kèm theo quay một đối tượng một góc α (cv::getRotationMatrix2D()). Ma trận biến đổi có dạng như sau:

ss_14

Chú ý: Hệ tọa độ trong ảnh lấy góc trên bên trái làm gốc tọa độ (0,0), còn hệ tọa độ thường hay lấy điểm dưới bên trái làm gốc tọa độ (0,0). Trong phần Phép quay một góc α quanh tâm bất kỳ lấy điểm dưới bên trái làm gốc tọa độ (0, 0).

ss_15

Làm nghiêng (Skew) ảnh với phép biến dạng (Shearing)

Quay trở lại với nội dung phần Phép biến dạng (Shearing), đoạn code như sau:

double M[2][3] = {1, 0.5, 0, 0, 1, 0}; // các phần tử của ma trận.
cv::Mat matRot(2, 3 ,CV_64F, M); // Khởi tạo một ma tận có tên là mat_rot.
warpAffine(imageSrc, imageDst, matRot, imageSrc.size());

Phân tích:

  • Dòng 1: Khởi tạo các phần tử của ma trận M cho phép biến dạng (Shearing) với shx = 0.5.
  • Dòng 2: Khởi tạo ma trận có các phẩn tử M có tên là matRot.
  • Dòng 3: Xử lý hình ảnh với phép biến dạng (Shearing).
ss_16
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024