Cách Nhân Tích Chập Giữa Hai Ma Trận - LTP Production

LTP Production

Header Ads

  • Home
  • Home / hoc lap trinh can ban / học lập trình cho người mới bắt đầu / lap trinh can ban / tin hoc lap trinh / Cách Nhân Tích Chập Giữa Hai Ma Trận Cách Nhân Tích Chập Giữa Hai Ma Trận hoc lap trinh can ban, học lập trình cho người mới bắt đầu, lap trinh can ban, tin hoc lap trinh Xem minh hoạ thực hiện: Ảnh minh hoạ theo thứ tự từ trái qua phải và từ trên xuống dưới. Ảnh cuối cùng là kết quả sau khi thực hiện di chuyển kernel hết toàn bộ ảnh. Ký hiệu: (1) ảnh nguồn, (2) kernel, (3) ảnh kết quả. Để dễ hiểu, bạn có thể xoay ma trận kernel góc 180độ theo chiều kim đồng hồ, sau đó kết quả tích chập chính là tổng các tích của hai phần tử cùng vị trí nằm trên kernel và trên ảnh. Một số cách xử lý vùng kernel vượt ra ngoài khỏi ảnh:
    • Bỏ qua, không thực hiện tính phần tử đó vào kết quả.
    • Sử dụng một hằng số để tính toán.
    • Duplicate pixel nằm ở biên của ảnh.
    Trong bài viết này, tôi sử dụng phương án giải quyết bỏ qua vùng ở ngoài biên, không cho vào kết quả.

    Tính chất

    Tích chập được định nghĩa là 1 phép toán trên không gian khả tích của các hàm tuyến tính, cho nên nó có tính chất giao hoán, kết hợp và phân phối. Giao hoán: f * g = g * f. Kết hợp: f * g * h = f * (g * h). Phân phối: f * g + f * h = f * (g + h). Do tính chất kết hợp của phép tích chập, khi một phép xử lý ảnh yêu cầu thực hiện tích chập liên tiếp với nhiều bộ lọc (kernel) (f * g * h). Ta có thể tính toán trước ma trận kernel để "giảm độ phức tạp tính toán" (k = v * h) do kích thước ma trận kernel hầu như rất nhỏ so với ảnh. Lúc này, thay vì thực hiện tích chập theo thứ tự r = (f * g) * h, ta thực hiện r = f * (v * h) = f * k. Ký hiệu: - f: hàm ảnh; - g: bộ lọc thứ nhất; - h: bộ lọc thứ hai; - r: hàm ảnh kết quả.

    Tối ưu thực hiện

    Convolution vẫn còn là một kỹ thuật với độ phức tạp tính toán cao. Một số cách dưới đây có thể tối ưu tốc độ của convolution:
    • Mỗi phần tử trong ma trận kernel nên là số nguyên: như trong ví dụ trên, các phần tử trong kernel thực ra là số thực, tuy nhiên, tôi thực hiện chuyển sang ma trận số nguyên với số hạng chung cho tất cả các phần tử, kết quả tích chập sẽ nhân cho số hạng chung này.
    • Kernel nên thực hiện lưu trong mảng một chiều.
    • Tạo ma trận chỉ số truy cập nhanh, với cách này có thể truy cập nhanh đến pixel trên ảnh, tương ứng với kernel mà không cần tính toán chỉ số thêm lần nữa.Ví dụ, với kernel (size: 3x3, anchor point: center)

    Hiện thực hoá với code

    Code chỉ thực hiện với ảnh xám
    1. voidConvolution::doConvolution(Mat& sourceImage,Mat& destinationImage)
    2. {
    3. int nr = sourceImage.rows;
    4. int nc = sourceImage.cols;
    5. // Tạo matrix để lưu giá trị pixel sau khi thực hiện tích chập.
    6. destinationImage.create(Size(nc, nr), CV_8UC1);
    7. // Đi lần lượt từng pixel của ảnh nguồn.
    8. for(int i =0; i < nr; i ++)
    9. {
    10. // Lấy địa chỉ dòng của ảnh đích, để lưu kết quả vào.
    11. uchar* data = destinationImage.ptr<uchar>(i);
    12. for(int j =0; j < nc; j ++)
    13. {
    14. // Lưu tổng giá trị độ xám của vùng ảnh tương ứng với kernel
    15. int g_val =0;
    16. // Duyệt mask, giá trị pixel đích là tổ hợp tuyến tính của mask với ảnh nguồn.
    17. for(int ii =0; ii < _kernel.size(); ii ++)
    18. {
    19. //_kernelIndex: mảng chỉ số truy cập nhanh
    20. int index_r = i - _kernelIndex[ii].x;
    21. // Với pixel nằm ngoài biên, bỏ qua.
    22. if(index_r <0|| index_r > nr -1)
    23. continue;
    24. int index_c = j - _kernelIndex[ii].y;
    25. if(index_c <0|| index_c > nc -1)
    26. continue;
    27. g_val += _kernel[ii]* sourceImage.at<uchar>(index_r, index_c);
    28. }
    29. // Gán giá trị cho matrix đích.
    30. data[j]= g_val;
    31. }
    32. }
    33. }
    SHARE THIS Share it Tweet Share it Share it Pin it

    Related Posts

    tin hoc lap trinh

    Post a Comment

    Bài Viết Mới Nhất

    • Cách Nhân Tích Chập Giữa Hai Ma Trận Cách Nhân Tích Chập Giữa Hai Ma Trận Xem minh hoạ thực hiện: Ảnh minh hoạ theo thứ tự từ trái qua phải và từ trên xuống dưới. Ảnh cuối cùng là kết quả sau khi thực hiện di chu...
    • Giới thiệu thuật toán vẽ và tô các đường cơ bản Giới thiệu thuật toán vẽ và tô các đường cơ bản Tổng quan            Mục tiêu Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: Thế nào là hệ đồ họa Thiết kế và...
    • Học Lập Trình Cho Người Mới Bắt Đầu Học Lập Trình Cho Người Mới Bắt Đầu Chào các bạn mình là sinh viên năm 3 của một trường học viện ùi, giờ mới lọ mọ hoc code trước giờ toàn chơi suốt Nên giờ mới cày lại đây :(...
    •  Giáo Trình Kĩ Thuật Đo Họa PTIT Giáo Trình Kĩ Thuật Đo Họa PTIT   Giáo Trình Kĩ Thuật Đồ Họa PTIT Chào các bạn, vậy là thấm thoát đã gần hết năm 3 đại học rồi. Hôm nay mình xin chia sẻ cho các bạn F...
    • Tong Quan Về ASP.NET MVC Giới Thiệu  ASP.NET  MVC. 1. MVC là gì?     Model-View-Controller (MVC) là một mô hình kiến trúc chia một ứng dụng thành ba thành p...
    • Người mới bắt đầu học lập trình cần tập trung vào những gì ? Người mới bắt đầu học lập trình cần tập trung vào những gì?     Lập trình ngày nay đã đang rất phổ biến.Tuy nhiên nó cũng khá khó hi...

    List Bài Viết Hay

    • ASP.NET MVC
    • giao trinh ptit
    • hoc lap trinh can ban
    • học lập trình cho người mới bắt đầu
    • ki thuat do hoa
    • ktdh ptit
    • lap trinh can ban
    • mạng máy tính
    • mang may tinh ptit
    • mmt ptit
    • Người mới bắt đầu học lập trình cần tập trung
    • Người mới bắt đầu học lập trình cần tập trung vào những gì?
    • tin hoc lap trinh

    Comments

    NAME: Email: Website: Comment: Powered by Blogger.

    Random Posts

    Recent Posts

    Popular Posts

    •  Giáo Trình Kĩ Thuật Đo Họa PTIT Giáo Trình Kĩ Thuật Đo Họa PTIT   Giáo Trình Kĩ Thuật Đồ Họa PTIT Chào các bạn, vậy là thấm thoát đã gần hết năm 3 đại học rồi. Hôm nay mình xin chia sẻ cho các bạn F...
    • Học Lập Trình Cho Người Mới Bắt Đầu Học Lập Trình Cho Người Mới Bắt Đầu Chào các bạn mình là sinh viên năm 3 của một trường học viện ùi, giờ mới lọ mọ hoc code trước giờ toàn chơi suốt Nên giờ mới cày lại đây :(...
    • Người mới bắt đầu học lập trình cần tập trung vào những gì ? Người mới bắt đầu học lập trình cần tập trung vào những gì?     Lập trình ngày nay đã đang rất phổ biến.Tuy nhiên nó cũng khá khó hi...
    Created By ThemeXpose

    Từ khóa » Tích Chập Ma Trận