STDIO
Tìm kiếm gần đây

    Nội dung

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

    23/01/2015
    Xử Lý Ảnh Với OpenCV: Phóng To, Thu Nhỏ Và Xoay Ảnh
    Nẳm trong loạt bài viết trong chương trình Tự Học OpenCV Qua Các Ví Dụ Thực Tế. Bài viết sẽ giới thiệu các phép biến đổi 2D, các phép biến đổi cơ sở như tịnh tiến, thay đổi tỉ lệ, xoay, biến dạng một đối tượng và các ví dụ về xử lý hình ảnh phóng to, thu nhỏ, xoay ảnh làm nghiêng 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,...

    Tiền đề bài viết

    Bài viết nằm trong loạt bài viết chương trình Tự Học OpenCV Qua Các Ví Dụ Thực Tế được tài trợ bởi STDIO. Trong bài biết này sẽ hướng dẫn:

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

    Đối tượng hướng đến

    Bài viết hướng tới các bạn đọc mới tìm hiểu về xử lý ảnh, đặc biệt là với OpenCV và chưa có kiến thức tương đương..

    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úng ta 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ồ.

    ss_6

    ss_7

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

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

    ss_8

    sx và sy đượ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ì ta 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.

    ss_10

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

    //@@///////////////////////////////////////////////////////////////////////////////////////
    //
    // www.stdio.vn
    // www.stdio.vn/users/index/11/truong-dat
    //
    ///////////////////////////////////////////////////////////////////////////////////////////
    
    #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;
    }
    Phân tích

    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ỳ

    Ta có thể 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 ta đượ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 ta 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).

    Build/Run

    ss_15

    Làm nghiêng (Skew) một tấm ả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). Tôi có một đ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 sh= 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).
    Build/Run

    ss_16

    Tổng kết

    Trong OpenCV mặc dù đã xây dựng rất nhiều các xử lý ảnh có sẵn để cho lập trình viên có thể xử lý nhanh chóng. Nhưng bạn hoàn toàn có thể can thiệp vào cũng như xây dựng những phương thức xử lý ảnh riêng nhờ vào các ý tưởng chung trên.

    Tham khảo

    https://www.wikipedia.org/

    http://docs.opencv.org/doc/tutorials/tutorials.html

    Thảo luận

    In order to comment you must be a STDIO Insider. Please sign up or log in to continue.

    Đăng nhập

    Bài viết liên quan

    Một Số Thao Tác Xử Lý Ảnh Cơ Bản Với EmguCV

    Một Số Thao Tác Xử Lý Ảnh Cơ Bản Với EmguCV

    Bài viết nằm trong loạt bài viết tự học OpenCV qua ví dụ thực tế. Trong bài viết này tôi sẽ hướng dẫn một số thao tác xử lý ảnh cơ bản với thư viện EmguCV bao gồm: load ...

    Trương Xuân Đạt

    23/01/2015

    Xử Lý Ảnh Với OpenCV: Các Phép Toán Hình Thái Học

    Xử Lý Ảnh Với OpenCV: Các Phép Toán Hình Thái Học

    Nẳm trong loạt bài viết trong chương trình Tự Học OpenCV Qua Các Ví Dụ Thực Tế. Bài viết giới thiệu những thuật toán cơ sở trong xử lý hình thái học, và đã giới thiệu ...

    Trương Xuân Đạt

    23/01/2015

    Một Số Thao Tác Xử Lý Ảnh Cơ Bản Với EmguCV (Tiếp Theo)

    Một Số Thao Tác Xử Lý Ảnh Cơ Bản Với EmguCV (Tiếp Theo)

    Bài viết nằm trong loạt bài viết tự học OpenCV qua ví dụ thực tế. Trong bài viết này tôi sẽ hướng dẫn một số thao tác xử lý ảnh cơ bản với thư viện EmguCV như: Gradient, ...

    Trương Xuân Đạt

    23/01/2015

    OpenCV – Cài Đặt Và Ví Dụ Minh Họa Sử Dụng

    OpenCV – Cài Đặt Và Ví Dụ Minh Họa Sử Dụng

    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, ...

    Vũ Quang Huy

    29/09/2014

    Xử Lý Ảnh Với OpenCV: Lọc Số Trong Ảnh

    Xử Lý Ảnh Với OpenCV: Lọc Số Trong Ảnh

    Nẳm trong loạt bài viết trong chương trình Tự Học OpenCV Qua Các Ví Dụ Thực Tế. Bài viết sẽ giới thiệu khái niệm lọc số ảnh là gì?, khái niệm và công thức nhân chập ma ...

    Trương Xuân Đạt

    23/01/2015

    Giới Thiệu Thư Viện EmguCV Và Cách Tích Hợp Vào .NET

    Giới Thiệu Thư Viện EmguCV Và Cách Tích Hợp Vào .NET

    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, ...

    Trương Xuân Đạt

    22/01/2015

    Xử Lý Ảnh Với OpenCV: Độ Sáng, Độ Tương Phản Và Biểu Đồ Tần Số Histogram

    Xử Lý Ảnh Với OpenCV: Độ Sáng, Độ Tương Phản Và Biểu Đồ Tần Số Histogram

    Nẳm trong loạt bài viết trong chương trình Tự Học OpenCV Qua Các Ví Dụ Thực Tế. Bài viết sẽ giới thiệu tăng giảm độ sáng, độ tương phản của một tấm ảnh. Giới thiệu, cách ...

    Trương Xuân Đạt

    23/01/2015

    Cơ Bản Về Ảnh - Cách OpenCV Lưu Trữ Dữ Liệu Ảnh

    Cơ Bản Về Ảnh - Cách OpenCV Lưu Trữ Dữ Liệu Ảnh

    Ảnh là một khái niệm quen thuộc đối với tất cả mọi người. Tuy nhiên, không có nhiều người hiểu chi tiết về ảnh, theo cái nhìn xử lý ảnh. Vì thế, trong bài viết này, tôi ...

    Kim Uyên

    24/05/2016

    Lọc Ảnh Bằng Phép Tương Quan Và Tích Chập

    Lọc Ảnh Bằng Phép Tương Quan Và Tích Chập

    Bài viết mô tả phép lọc ảnh sử dụng tương quan và tích chập trong lĩnh vực xử lý ảnh mà không cần sử dụng các thư viện như OpenCV, từ đó người đọc có thể hiểu chuyên sâu ...

    Phan Tấn Phúc

    13/09/2017

    Làm Quen Với Thư Viện Imaging (PIL) -  Phần 1: Cơ bản

    Làm Quen Với Thư Viện Imaging (PIL) - Phần 1: Cơ bản

    Đôi lúc bạn sẽ gặp phải các vấn đề về xử lý hình ảnh trong công việc của mình. Python cho phép bạn thực hiện điều đó dễ dàng thông qua thư viện Imaging (PIL). Thư viện ...

    Ryan Lê

    18/03/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020