Phải làm gì khi bị Ransomware tấn công?

VSEC - BLOG Xu hướng thế giới mạng

Tháng 2/2024 được cho là tháng hoàn toàn hỗn loạn trong không gian mạng khi liên tiếp xảy ra các vụ tấn công tống tiền bằng mã độc Ransomware. Thiệt hại kinh tế từ các vụ tấn công mạng và các vụ mất dữ liệu lên tới hàng tỷ đô. Ngay cả các doanh nghiệp lớn được cho là có đầu tư vào an toàn thông tin cũng lúng túng

Ransomware đang xuất hiện hàng ngày, hàng giờ

Theo thống kê, năm 2023 là năm “bùng nổ” của các cuộc tấn công ransomware: tổng số tiền các nạn nhân đã trả vượt 1 tỷ đô la, 10% các tổ chức bị nhắm tới bởi ransomware. Có thể thấy rằng, tấn công ransomware vào doanh nghiệp vẫn là một xu hướng chung và Việt Nam cũng không ngoài xu hướng đó, bên cạnh hướng tấn công vào người dùng phổ thông đang dần chững lại.

Trong thời gian gần đây, Ransomware LockBit – LockBit 3.0 cũng đã trở thành mối nguy hại nghiêm trọng nhất mà các doanh nghiệp đang phải đối mặt. Mối đe dọa này đánh dấu một bước tiến đáng kể trong lĩnh vực ransomware, đặc trưng bởi các chiến thuật tinh vi và khả năng toàn diện của nó. LockBit 3.0 không chỉ thể hiện khả năng vượt trội trong việc thích ứng với các biện pháp phòng vệ an ninh mạng đang phát triển mà còn thể hiện mức độ tổ chức và phối hợp cao hơn. LockBit chiếm 27,93% trong tổng số các cuộc tấn công bằng ransomware đã biết từ tháng 7 năm 2022 đến tháng 6 năm 2023. Con số này nhấn mạnh hiệu suất và hiệu quả vượt trội của nhóm trong việc thực hiện các cuộc tấn công mạng, thể hiện mức độ hoạt động chính xác khiến nhóm này trở nên khác biệt trong lĩnh vực hoạt động mạng độc hại.

Điều khiến LockBit 3.0 khác biệt so với các đối tác của nó không chỉ đơn thuần là mức độ phổ biến mà còn là sự phát triển về mặt phương pháp của nó. Nhóm liên tục cải tiến các chiến thuật của mình, kết hợp các công nghệ tiên tiến và thích ứng với bối cảnh an ninh mạng luôn thay đổi. Sự nhanh nhẹn này đã cho phép LockBit 3.0 vượt trội hơn các cơ chế phòng thủ truyền thống, đặt ra thách thức dai dẳng cho các tổ chức thuộc mọi quy mô. Do đó, dòng mã độc này đang được nhiều kẻ tấn công sử dụng.

Nạn nhân thực sự của Ransomware là ai?

Nạn nhân Ransomware là ai?

Theo thống kê của VSEC cho thấy, tất cả các lĩnh vực kinh tế đều đã từng bị Ransomware “ghé thăm”. Trong năm 2023, lĩnh vực chăm sóc sức khỏe đang xếp Top 1 lĩnh vực bị tấn công và rò rỉ dữ liệu nhiều nhất toàn cầu, chi phí trung bình của một cuộc vi phạm dữ liệu trong lĩnh vực này đã tăng 53,3% vượt hơn 3 triệu USD so với chi phí trung bình chỉ là 7,13 triệu USD trong năm 2020. Tại Hoa kỳ, lĩnh vực này được coi là ngành công nghiệp quan trọng, đặc biệt là hệ thống cơ sở hạ tầng. Kể từ khi đại dịch Covid-19 diễn ra, ngành này đã ghi nhận mức chi phí vi phạm dữ liệu trung bình cao hơn đáng kể.

Tại Việt Nam, từ đầu năm tới nay, hệ thống thông tin của hàng loạt đơn vị tài chính, ngân hàng, hành chính công,… đã bị tấn công, gây gián đoạn hoạt động và thiệt hại về vật chất của các doanh nghiệp. Điều này đã làm ngưng trệ trên toàn bộ hệ thống, không chỉ gây ra mức tổn thất nặng nề về kinh tế mà còn tổn hại khá lớn tới uy tín của doanh nghiệp.

Theo Báo cáo an ninh mạng 2024 của Công ty cổ phần An ninh mạng Việt Nam (VSEC) cho biết, có tới 70% các tổ chức SME đã và đang gặp phải các cuộc tấn công Ransomware. Điều này cho thấy, không chỉ các tổ chức, doanh nghiệp lớn mới là đích đến của các nhóm hacker, mà các đơn vị, doanh nghiệp nhỏ cũng là “miếng mồi ngon” đối với tin tặc.

Cái giá phải trả cho một “click chuột” là quá đắt!

Chi phí trung bình của các cuộc tấn công ransomware có thể là một thách thức vì không phải tất cả các báo cáo vi phạm dữ liệu đều được đưa ra ánh sáng. Một số công ty và doanh nghiệp nhỏ thích lặng lẽ thực hiện các khoản thanh toán của họ và quét các sự cố ransomware dưới tấm thảm, thay vì thừa nhận những thiếu sót của họ với các nhà quản lý và giải quyết các vấn đề bảo mật dữ liệu của họ. Chi phí trung bình của các cuộc tấn công ransomware dựa trên dữ liệu của chính họ trong báo cáo hàng năm.

Chi phí tài chính của các cuộc tấn công ransomware

Khi có sẵn các bản sao lưu, chi phí trung bình có phần thấp hơn — nhưng những chi phí này vẫn lên tới hàng triệu đô la.

Chi phí phục hồi trung bình từ một cuộc tấn công ransomware (không bao gồm tiền chuộc) là 1.82 triệu USD. Trong khi đó 2.6 triệu USD là chuộc trung bình để khôi phục dữ liệu bị mất, mặc dù điều này có thể giảm xuống còn 1,6 triệu đô la bằng cách sử dụng các bản sao lưu

Chi phí thời gian của các cuộc tấn công ransomware

Thời gian là tiền bạc. Cần có thời gian phục hồi đáng kể để trở lại đúng hướng, đặc biệt là đối với các công ty đã chọn trả phí chuộc. Có tới 45% các tổ chức có bản sao lưu vật lý đã có thể khôi phục trong vòng 1 tuần, nhưng đối với các tổ chức đã trả phí thì con số chỉ là 39%.

Hành động như thế nào khi bị Ransomware tấn công?

Chuyên gia an ninh mạng từ VSEC chia sẻ khi hệ thống bị tấn công, các doanh nghiệp cần thực hiện các hành động đơn giản sau để đảm bảo thiệt hại thấp nhất. Doanh nghiệp cần đánh giá trạng thái của sự cố để đưa ra phương án phù hợp có 2 hướng thực hiện đồng thời:

Cô lập, giữ nguyên hiện trạng để điều tra chi tiết nguyên nhân sự cố. Một số hình thức xử lý khi bị tấn công ransomware như có thể tạm thời cô lập các kết nối mạng từ vùng mạng bên ngoài vào hệ thống để ngăn chặn rủi ro lây lan, ảnh hưởng. Chuyển sang sử dụng hệ thống dự phòng (nếu có). Thu thập các nhật ký (logs) của thiết bị phục vụ điều tra về sau.

Tiếp theo, không tự ý khôi phục hệ thống bị ảnh hưởng khi chưa xác định được mức độ an toàn của hệ thống. Điều này vô cùng quan trọng trong việc lưu lại các bằng chứng giúp các chuyên gia điều tra gốc rễ của nguyên nhân.

Trong trường hợp không có chuyên môn, tổ chức doanh nghiệp nên liên hệ các công ty chuyên thực hiện xử lý sự cố tấn công mạng để có được khuyến nghị phù hợp. Việc triển khai dịch vụ ứng cứu sự cố an ninh mạng sẽ mang tới cho các doanh nghiệp những lợi ích cụ thể như: Giúp ngăn chặn/khắc phục một cách nhanh chóng những sự cố về an ninh an toàn thông tin của hệ thống; Hạn chế và giảm thiểu tối đa những thiệt hại về kinh tế cũng như sự gián đoạn trong hoạt động của các tổ chức; Hệ thống thông tin luôn được đảm bảo 24/7

Về VSEC

VSEC là đơn vị đánh giá an toàn hàng đầu tại Việt Nam với 20 năm kinh nghiệm triển khai các hoạt động an toàn thông tin trong nước và quốc tế. Là Nhà cung cấp dịch vụ quản trị An toàn thông tin tiên phong tại Việt Nam đạt chứng nhận quan trọng CREST cho dịch vụ SOC (Trung tâm Giám sát và Vận hành an toàn thông tin) và Penetration Testing (Kiểm thử xâm nhập).

Theo Cafef

Webinar: “Những điều cần biết khi xử lý sự cố an ninh mạng”

VSEC - BLOG Sự kiện
Theo số liệu thống kê từ báo cáo an ninh mạng 2024 của VSEC, số lượng và mức độ tinh vi của các cuộc tấn công mạng ngày càng gia tăng thông qua các hình thức tấn công như: Phishing email, Ransomware, 0-day,… Điển hình là hai cuộc tấn công bằng mã độc tống tiền trong thời gian vừa qua nhắm vào VNDirect vs PVOil vừa qua, gây ra hệ quả vô cùng nghiêm trọng. Điều này đã dấy lên hồi chuông cảnh báo về sự nguy hiểm của các cuộc tấn công mạng cũng như tầm quan trọng trong việc bảo vệ hệ thống dữ liệu của doanh nghiệp.
Vậy làm thế nào để có thể xác định được những mối nguy hiểm đang tồn tại trong hệ thống của mình và chúng ta cần làm gì khi doanh nghiệp không may gặp phải sự cố tấn công mạng? Các doanh nghiệp cần phải làm gì khi hệ thống đang bị tấn công? Làm thế nào để phát hiện ra những nguy hại đang tiềm ẩn trong hệ thống dữ liệu – tài sản quan trọng nhất – để đảm bảo an ninh mạng cho hệ thống của doanh nghiệp mình?
Tất cả sẽ được giải đáp tại webinar “Những điều cần biết khi xử lý sự cố An ninh mạng” bởi các chuyên gia của Công ty Cổ phần an ninh mạng Việt Nam

1. Thời gian, hình thức tổ chức
⏰ Thời gian: 10h00 ngày 25/04/2024 (thứ năm)
💻 Hình thức: Zoom Online
🔗 Link đăng ký: https://lnkd.in/gT5v4DYY
2. Nội dung chi tiết
Thời gian Nội dung
10h00 – 10h20 Giới thiệu chung về chương trình
Hướng dẫn truy cập link tài liệu
Hướng dẫn thực hiện khảo sát An toàn thông tin đầu giờ
10h20 – 10h45 Topic: Quy trình và kinh nghiệm xử lý sự cố an toàn thông tin
11h45 – 11h05 Hỏi đáp cùng MC
11h05 – 11h15 Gói tư vấn An toàn thông tin cho doanh nghiệp trong tháng 5/2024
Đối tượng: Các thành viên đã tham gia làm Khảo sát ATTT
11h15 Kết thúc webinar
3. Diễn giả, chủ đề
Tại Webinar lần này, diễn giả Vũ Thế Hải – SOC Manager VSEC sẽ “một lần nói hết” về những rủi ro và tổn thất khi chúng ta “cứu” hệ thống sai cách,  quy trình ứng cứu sự cố an ninh mạng cũng như cách phòng tránh hiệu quả đối với hệ thống của mình. Anh Vũ Thế Hải đã hơn 10 năm hoạt động trong lĩnh vực An toàn thông tin, anh Hải đã đảm nhiệm vai trò quản lý tại nhiều công ty công nghệ tại Việt Nam và hiện tại đang là Trưởng phòng Giám sát và vận hành An toàn thông tin (SOC) tại Công ty Cổ phần An ninh mạng Việt Nam – VSEC.
Anh Hải và các cộng sự đã cùng nghiên cứu và phát triển, đưa SOC VSEC trở thành Trung tâm giám sát và vận hành An toàn thông tin đầu tiên tại Việt Nam đạt chứng chỉ CREST cho dịch vụ này. Anh Vũ Thế Hải cũng được biết đến trong các chương trình hội thảo chuyên ngành, diễn tập An toàn thông tin, và là tác giả của hàng loạt các kịch bản diễn tập phong phú.
Đừng bỏ lỡ sự kiện quan trọng này, hãy luôn giữ hệ thống của doanh nghiệp mình luôn ở trạng thái an toàn nhất! Sẽ rất tiếc nuối khi bạn không tham dự webinar bởi có rất nhiều điều hữu ích tại buổi webinar đang chờ đón bạn. Nhớ đăng ký tại link nhé: https://lnkd.in/gT5v4DYY

Ransomware LockBit – Lockbit 3.0: Mối nguy hại nghiêm trọng nhất

VSEC - BLOG Nổi bật Xu hướng thế giới mạng

Khi nói đến các mối đe dọa an ninh mạng mới nhất và lớn nhất, có một cái tên nổi bật: LockBit 3.0. Vào năm 2022 , LockBit là nhóm ransomware và nhà cung cấp Ransomware-as-a-Service (RaaS) toàn cầu hoạt động tích cực nhất xét về số lượng nạn nhân được xác nhận trên trang web rò rỉ dữ liệu của họ.

Mối đe dọa này đánh dấu một bước tiến đáng kể trong lĩnh vực ransomware, đặc trưng bởi các chiến thuật tinh vi và khả năng toàn diện của nó. LockBit 3.0 không chỉ thể hiện khả năng vượt trội trong việc thích ứng với các biện pháp phòng vệ an ninh mạng đang phát triển mà còn thể hiện mức độ tổ chức và phối hợp cao hơn. Nhóm này sử dụng các thuật toán mã hóa tiên tiến và tận dụng các kỹ thuật kỹ thuật xã hội phức tạp, khiến cho các cuộc tấn công của chúng trở nên đặc biệt khó ngăn chặn.

Trong bài phân tích này, chúng tôi đi sâu vào các đặc điểm và chiến lược chính được LockBit 3.0 sử dụng, trang bị kiến ​​thức cho những người bảo vệ để đối mặt với mối đe dọa mạnh mẽ và luôn thay đổi này. Bằng cách hiểu rõ các sắc thái trong chiến thuật của LockBit 3.0, những người bảo vệ có thể nâng cao khả năng sẵn sàng, phát triển các biện pháp phòng thủ chủ động và góp phần vào khả năng phục hồi chung trước mối đe dọa này.

  • LockBit 3.0 là gì ?

LockBit 3.0 đứng đầu trong các mối đe dọa mạng hiện đại. Nó đại diện cho một nhóm ransomware cực kỳ tinh vi đã nổi tiếng nhờ cách tiếp cận chiến lược và phạm vi tiếp cận toàn cầu. Nó đã phát triển thành một thế lực lớn trong bối cảnh mạng, xây dựng dựa trên chiến thuật của những tổ chức tiền nhiệm để trở thành kẻ thống trị trong thế giới tội phạm mạng.

LockBit chiếm 27,93% trong tổng số các cuộc tấn công bằng ransomware đã biết từ tháng 7 năm 2022 đến tháng 6 năm 2023. Con số này nhấn mạnh hiệu suất và hiệu quả vượt trội của nhóm trong việc thực hiện các cuộc tấn công mạng, thể hiện mức độ hoạt động chính xác khiến nhóm này trở nên khác biệt trong lĩnh vực hoạt động mạng độc hại.  

Điều khiến LockBit 3.0 khác biệt so với các đối tác của nó không chỉ đơn thuần là mức độ phổ biến mà còn là sự phát triển về mặt phương pháp của nó. Nhóm liên tục cải tiến các chiến thuật của mình, kết hợp các công nghệ tiên tiến và thích ứng với bối cảnh an ninh mạng luôn thay đổi. Sự nhanh nhẹn này đã cho phép LockBit 3.0 vượt trội hơn các cơ chế phòng thủ truyền thống, đặt ra thách thức dai dẳng cho các tổ chức thuộc mọi quy mô.

Hơn nữa, phạm vi địa lý hoạt động của LockBit 3.0 rất đáng chú ý. Nhóm thể hiện phạm vi tiếp cận toàn cầu thực sự, với các sự cố được báo cáo trải rộng trên nhiều ngành và khu vực khác nhau. Khả năng tác động quốc tế này nhấn mạnh sự cần thiết phải có phản ứng hợp tác và phối hợp toàn cầu để chống lại mối đe dọa nhiều mặt do LockBit 3.0 gây ra.

  • Sự phát triển của LockBit.

Hành trình của LockBit được đánh dấu bằng sự phát triển không ngừng nghỉ, biến nó thành một thế lực mạnh mẽ trong lĩnh vực ransomware. Nguồn gốc của nó có thể bắt nguồn từ tháng 9 năm 2019, khi những dấu hiệu hoạt động đầu tiên dưới biểu ngữ ransomware ABCD, tiền thân của LockBit, được quan sát thấy. Sự bắt đầu này đã đặt nền móng cho những gì sau này trở thành một loạt các mối đe dọa mạng tinh vi và có tác động mạnh mẽ.

Dòng thời gian sau đây dựa trên thông tin được Cơ quan An ninh Cơ sở hạ tầng và An ninh mạng (CISA) thu thập :

Tháng 9 năm 2019 Lần đầu ghi nhận Ransomware với tên ABCD ransomware, tiền thân của LockBit
Tháng 1 năm 2020 Phần mềm ransomware có tên LockBit lần đầu tiên xuất hiện trên các diễn đàn tội phạm mạng bằng tiếng Nga
Tháng 6 năm 2021 Xuất hiện LockBit phiên bản 2 (LockBit 2.0), còn gọi là LockBit Red, bao gồm StealBit, một công cụ đánh cắp thông tin được tích hợp sẵn
Tháng 10 năm 2021 Giới thiệu LockBit Linux-ESXi Locker phiên bản 1.0, mở rộng khả năng nhắm mục tiêu đến các hệ thống sang Linux và VMware ESXi
Tháng 3 năm 2022 Sự xuất hiện của LockBit 3.0, còn được gọi là LockBit Black, có điểm tương đồng với ransomware BlackMatter và Alphv (còn được gọi là BlackCat)
Tháng 9 năm 2022 Các chi nhánh không thuộc LockBit có thể sử dụng LockBit 3.0 sau khi trình tạo của nó bị rò rỉ
Tháng 1 năm 2023 Sự xuất hiện của LockBit Green kết hợp mã nguồn từ Conti ransomware
Tháng 4 năm 2023 Các bộ mã hóa ransomware LockBit nhắm mục tiêu vào macOS được thấy trên VirusTotal

Các phiên bản của LockBit đều nhắm vào các mục tiêu Windows như sau:

  • LockBit
  • LockBit 2.0
  • LockBit 3.0 (LockBit Black)
  • Từ năm 2023, hai phiên bản mới đã được xác định: 
    • LockBit Green (Dựa trên ransomware Conti).
    • LockBit Red (Dựa trên LockBit 2.0).

Các cập nhật đáng chú ý:

  • LockBit sang LockBit 2.0:
    • Xoá “Shadow copy” bằng vssadmin
    • Bỏ qua Kiểm soát Tài khoản Người dùng – Bypass UAC (User Account Control)
    • In thông báo tống tiền qua máy in
    • Tự lây nhiễm
  • LockBit 2.0 sang LockBit 3.0:
    • Thực hiện logic của phần mềm độc hại BlackMatter Ransomware
      • Xóa bản sao Shadow thông qua Windows Management Instrumentation (WMI)
      • Bảo vệ bằng mật khẩu
      • Duy trì thông qua Dịch vụ Hệ thống
      • Thu thập API
      • In thông báo chuộc tiền dưới dạng hình nền Desktop

Nhóm ransomware LockBit đã đầu tư mạnh vào việc phát triển công cụ riêng của mình, điều này được thể hiện rõ ràng qua việc thường xuyên cập nhật phiên bản cũng như tạo ra công cụ lấy dữ liệu riêng StealBit.

LockBit cũng mở rộng thị trường bằng cách bổ sung hệ điều hành mục tiêu như LockBit Linux/ESXi nhắm đến máy chạy Linux. Một biến thể MacOS X cũng được phát hành vào tháng 4/2023.

Nhóm này nổi tiếng với chương trình khuyến khích báo lỗi nhằm “nâng cao” hoạt động của nhóm ransomware..

Mỗi giai đoạn phát triển của LockBit đều đưa ra những mức độ phức tạp mới và khả năng nâng cao. Nó nêu bật cam kết của nhóm trong việc đa dạng hóa chiến thuật của mình và nhấn mạnh sự cần thiết của những người bảo vệ phải luôn cảnh giác với câu chuyện liên tục diễn ra về quá trình phát triển của LockBit.

  • Phân tích chiến thuật.

LockBit 3.0, còn được gọi là “LockBit Black”, có tính mô-đun và tính ẩn danh cao hơn các phiên bản trước đó và có những điểm tương đồng với phần mềm tống tiền Blackmatter và Blackcat. LockBit 3.0 được cấu hình khi biên dịch với nhiều tùy chọn khác nhau để xác định hành vi của ransomware. Khi thực thi ransomware thực tế trong môi trường nạn nhân, nhiều đối số khác nhau có thể được đưa ra để sửa đổi thêm hành vi của ransomware. 

Ví dụ: LockBit 3.0 chấp nhận các đối số bổ sung cho các hoạt động cụ thể trong phase Lateral Movement và khởi động lại – Reboot vào Chế độ an toàn – Safe Mode (xem các tham số LockBit Command Line trong Chỉ báo thỏa hiệp – Indicators of Compromise). Nếu đơn vị liên kết của LockBit không có quyền truy cập vào phần mềm ransomware LockBit 3.0 không mật khẩu thì bắt buộc phải có đối số mật khẩu trong quá trình thực thi phần mềm ransomware. Các chi nhánh của LockBit 3.0 không nhập đúng mật khẩu sẽ không thể thực thi ransomware [T1480.001]. Mật khẩu là khóa giải mã tệp thực thi LockBit 3.0. Bảo vệ mã nguồn theo cách này, LockBit 3.0 cản trở phát hiện và phân tích malware khi mã nguồn ở dạng mã hóa và không thể thực thi hay đọc. Phát hiện dựa trên chữ ký có thể không phát hiện được tệp thực thi LockBit 3.0 khi phần mã hóa của nó thay đổi dựa trên khóa mã hóa sử dụng trong khi tạo ra một định danh duy nhất. Khi cung cấp đúng mật khẩu, LockBit 3.0 sẽ giải mã thành phần chính, tiếp tục giải mã hoặc giải nén mã và thực thi ransomware.

LockBit 3.0 chỉ tấn công vào các máy tính không có ngôn ngữ cài đặt khớp với danh sách loại trừ. Tuy nhiên, việc kiểm tra ngôn ngữ hệ thống trong quá trình chạy được quyết định thông qua một cờ cấu hình được thiết lập lúc biên dịch. Các ngôn ngữ được loại trừ bao gồm Romanian (Moldova), Arabic (Syria), và Tatar (Russia), nếu phát hiện một trong số này, LockBit 3.0 sẽ dừng thực thi mà không lây nhiễm vào hệ thống

MITRE ATT&CK TECHNIQUES

1. INITIAL ACCESS

Techniques Title ID Use
Valid Account T1078 Các tác nhân của LockBit 3.0 thu thập và lạm dụng thông tin đăng nhập của các tài khoản đã tồn tại như một cách để đạt được quyền truy cập ban đầu.
Exploit External Remote Services T1133 Các tác nhân của LockBit 3.0 lợi dụng RDP để tiếp cận các mạng của nạn nhân.
Drive-by Compromise T1189 Các tác nhân của LockBit 3.0 lấy được quyền truy cập vào hệ thống thông qua việc người dùng truy cập một trang web trong quá trình duyệt web bình thường.
Exploit Public-Facing Application T1190 Các tác nhân của LockBit 3.0 lợi dụng các lỗ hổng trong các hệ thống đặt trước mặt Internet để đạt được quyền truy cập vào hệ thống của nạn nhân.
Phishing T1566 Các tác nhân của LockBit 3.0 sử dụng các kỹ thuật lừa đảo và lừa đảo cá nhân (spearphishing) để đạt được quyền truy cập vào mạng của nạn nhân.

2. EXECUTION

Techniques Title ID Use
Execution TA0002 LockBit 3.0 thực hiện các lệnh trong quá trình thực thi của nó
Software Deployment Tools T1072 LockBit 3.0 sử dụng Chocolatey, một trình quản lý gói dòng lệnh cho Windows.

3. PERSISTENCE

Techniques Title ID Use
Valid Accounts T1078 LockBit 3.0 sử dụng một tài khoản người dùng bị nhiễm mã độc để duy trì tính liên tục trong mạng mục tiêu
Boot or Logo Autostart Execution T1547 LockBit 3.0 cho phép đăng nhập tự động để thực hiện việc nâng cao đặc quyền

4. PRIVILEGE ESCALATION

Techniques Title ID Use
Privilege Escalation TA0004 LockBit 3.0 sẽ cố gắng nâng cao đặc quyền cần thiết nếu đặc quyền của tài khoản hiện tại không đủ
Boot or Logo Autostart Execution T1547 LockBit 3.0 cho phép đăng nhập tự động để thực hiện việc nâng cao đặc quyền

5. DEFENSE EVASION

Techniques Title ID Use
Obfuscated Files or Information T1027 LockBit 3.0 sẽ gửi thông tin máy chủ và bot được mã hóa đến các máy chủ C2 của nó
Indicator Removal: File Deletion T1070.004 LockBit 3.0 sẽ tự xóa khỏi ổ đĩa
Execution Guardrails: Environmental Keying T1480.001 LockBit 3.0 chỉ giải mã thành phần chính hoặc tiếp tục giải mã và/hoặc nén dữ liệu nếu mật khẩu chính xác được nhập

6. CREDENTIAL ACCESS

Techniques Title ID Use
OS Credential Dumping: LSASS Memory

T1003.001

LockBit 3.0 sử dụng Microsoft Sysinternals ProDump để dump nội dung của LSASS.exe

7. DISCOVERY

Techniques Title ID Use
Network Service Discovery T1046 LockBit 3.0 sử dụng SoftPerfect Network Scanner để quét các mạng mục tiêu
System Information Discovery T1082 LockBit 3.0 sẽ liệt kê thông tin hệ thống bao gồm tên máy chủ, cấu hình máy chủ, thông tin miền, cấu hình ổ đĩa cục bộ, các chia sẻ từ xa và các thiết bị lưu trữ ngoại vi đã được gắn kết
System Location Discovery: System Language Discovery

T1614.001

LockBit 3.0 sẽ không lây nhiễm các máy tính có cài đặt ngôn ngữ trùng khớp với danh sách loại trừ được xác định

8. LATERAL MOVEMENT

Techniques Title ID Use
Remote Services: Remote Desktop Protocol

T1021.001

LockBit 3.0 sử dụng phần mềm Splashtop Remote Desktop để tạo điều kiện cho việc di chuyển dọc theo mạng

9. COMMAND & CONTROL

Techniques Title ID Use
Application Layer Protocol: File Transfer Protocols T1071.002 LockBit 3.0 sử dụng FileZilla cho C2 (Command and Control)
Protocol Tunnel  T1572 LockBit 3.0 sử dụng Plink để tự động hóa các hoạt động SSH trên Windows.

10. EXFILTRATION

Techniques Title ID Use
Exfiltration TA0010 LockBit 3.0 sử dụng Stealbit, một công cụ trộm cắp tùy chỉnh được sử dụng lần đầu tiên cùng với LockBit 2.0, để đánh cắp dữ liệu từ mạng mục tiêu
Exfiltration Over Web Service T1567 LockBit 3.0 sử dụng các dịch vụ chia sẻ tệp có sẵn công khai để trộm cắp dữ liệu của mục tiêu.
Exfiltration Over Web Service: Exfiltration to Cloud Storage

T1567.002

Các tác nhân của LockBit 3.0 sử dụng (1) rclone, một trình quản lý lưu trữ đám mây dòng lệnh mã nguồn mở để trộm cắp và (2) MEGA, một dịch vụ chia sẻ tệp công khai để trộm cắp dữ liệu.

11. IMPACT

Techniques Title ID Use
Data Destruction T1485 LockBit 3.0 xóa các tệp nhật ký và làm trống thùng rác
Data Encrypted for Impact T1486 LockBit 3.0 mã hóa dữ liệu trên các hệ thống mục tiêu để làm gián đoạn sẵn có của tài nguyên hệ thống và mạng.
Service Stop T1489 LockBit 3.0 chấm dứt các tiến trình và dịch vụ
Inhibit System Recovery T1490 LockBit 3.0 xóa shadow copies (volume shadow copies) đang tồn tại trên đĩa
Defacement: Internal Defacement T1491.001 LockBit 3.0 thay đổi hình nền và biểu tượng của hệ thống máy chủ thành hình nền và biểu tượng của LockBit 3.0 tương ứng

 

12. Tools

Tool Description MITRE ATT&CK
Chocolatey Trình quản lý gói dòng lệnh cho hệ điều hành Windows T1072
FileZilla Ứng dụng FTP đa nền tảng T1071.002
Impacket Bộ sưu tập các lớp Python để làm việc với các giao thức mạng S0357
MEGA Ltd MegaSync Công cụ đồng bộ hóa dựa trên đám mây T1567.002
Microsoft Sysinternals ProcDump Tạo các bản ghi crash. Thường được sử dụng để dump nội dung của Local Security Authority Subsystem Service, hay LSASS.exe T1003.001
Microsoft Sysinternals PsExec Thực thi một quy trình dòng lệnh trên một máy tính từ xa. S0029
Mimikatz Trích xuất thông tin đăng nhập từ hệ thống S0002
Ngrok Một công cụ truy cập từ xa hợp pháp bị lạm dụng để phá vỡ các biện pháp bảo vệ của mạng nạn nhân S0508
PuTTY Link (Plink) Có thể được sử dụng để tự động hóa các hành động Secure Shell (SSH) trên Windows T1572
Rclone Chương trình dòng lệnh để quản lý các tệp lưu trữ đám mây S1040
SoftPerfect Network Scanner Thực hiện quét mạng T1046
Splashtop Phần mềm điều khiển từ xa T1021.001
WinSCP Một trình SSH File Transfer Protocol dành cho Windows T1048

Nguồn tham khảo : CISA & CyberReason

Diễn tập thực chiến An toàn thông tin EVN lần 2 năm 2023

Sự kiện VSEC - BLOG

Ngày 20/3/2024, Ban Viễn thông và Công nghệ thông tin EVN phối hợp cùng Công ty Viễn thông Điện lực và Công nghệ thông tin (EVNICT); Công ty cổ phần An ninh mạng Việt Nam- VSEC đã tổ chức diễn tập thực chiến An toàn thông tin lần 2 năm 2023 với sự tham gia của 11 đội đến từ 35 đơn vị thuộc EVN.

Tham gia trực tiếp diễn tập là các cán bộ An toàn thông tin/ Công nghệ thông tin, cán bộ quản trị/vận hành hệ thống E-Payment của các Tổng công ty, các đơn vị hạch toán phụ thuộc EVN, EVNICT.

Nội dung diễn tập là diễn tập thực chiến phòng thủ cấp Tập đoàn cho hệ thống thanh toán điện tử (E-Payment).

Trong 01 ngày, các đội tham gia diễn tập đã thực hiện phân tích các bằng chứng được cung cấp trong file log đã được chuẩn bị trước và trả lời các câu hỏi mà ban tổ chức đưa ra qua 3 phần thi là CTF (Capture the Flag); Tự luận; Hỏi đáp.

Ông Võ Quang Lâm – Phó Tổng Giám đốc EVN phát biểu chỉ đạo tại buổi diễn tập.

Phát biểu tại buổi bế mạc diễn tập, ông Võ Quang Lâm- Phó Tổng Giám đốc EVN cho biết, “buổi diễn tập đã thành công vượt xa mong đợi và đã đem lại nhiều giá trị quý báu”.

“Trong suốt quãng thời gian của diễn tập, chúng ta đã được chứng kiến sự hỗ trợ, sự cống hiến và sự chuyên nghiệp của từng đội thi. Những kịch bản mô phỏng tấn công mạng được dựng lại sát với thực tế, giúp chúng ta nhận ra những yếu điểm và rủi ro tiềm ẩn trong hệ thống E-Payment của EVN. Thêm vào đó, các biện pháp điều tra, phân tích sự cố an toàn thông tin đã được các đội thi thử nghiệm và thực hiện, từ đó chúng ta có được những bài học quý báu để cải thiện hơn nữa hệ thống bảo mật thông tin. Với những kinh nghiệm và bài học rút ra từ buổi diễn tập này, chúng ta sẽ tiếp tục cải thiện và nâng cao hệ thống An ninh mạng của EVN, đảm bảo tính an toàn và bảo mật của các hệ thống công nghệ thông tin trong Tập đoàn chúng ta và các dịch vụ điện lực khác”- Phó Tổng Giám đốc EVN nhấn mạnh.

Ông Võ Quang Lâm- Phó Tổng Giám đốc EVN trao giải Nhất cho đội EVNSPC.

Kết quả, ban tổ chức đã trao giải Nhất cho Đội 1 Tổng Công ty Điện lực miền Nam (EVNSPC); Giải Nhì cho Đội 5 (EVNCPC) và Đội 2 (EVNHANOI); Giải Ba cho Đội 3 (EVNNPC), Đội 1 (EVNNPT) và Đội 6 (EVNHCMC). Các đội 11 (các đơn vị hạch toán phụ thuộc 2), đội 10 (các đơn vị hạch toán phụ thuộc 1), đội 8 (EVNGENCO2), đội 9 (EVNGENCO3), đội 7 (EVNGENCO1) đạt giải Khuyến khích.

11 đội tham gia diễn tập An toàn thông tin lần 2 năm 2023 gồm: Đội 1: Công ty Viễn thông Điện lực và Công nghệ thông tin (EVNICT); Đội 2: Tổng công ty Truyền tải điện Quốc gia (EVNNPT); Đội 3: Tổng công ty Điện lực miền Bắc (EVNNPC); Đội 4: Tổng công ty Điện lực miền Nam (EVNSPC); Đội 5: Tổng công ty Điện lực miền Trung (EVNCPC); Đội 6: Tổng công ty Điện lực TP Hà Nội (EVNHANOI); Đội 7: Tổng công ty Điện lực TP Hồ Chí Minh (EVNHCMC); Đội 8: Tổng công ty Phát điện 1 (EVNGENCO1); Đội 9: Tổng công ty Phát điện 2 (EVNGENCO2); Đội 10: Tổng công ty Phát điện 3 (EVNGENCO3); Đội 11: Các đơn vị HTPT EVN.

CSTV – Capture the flag 2023: Sân chơi chuyên nghiệp dành cho các Pentester tương lai tại Việt Nam

Sự kiện VSEC - BLOG

Ngày 06/01/2024, Làng Công nghệ An toàn an ninh thông tin đã tổ chức thành công CSTV – Capture the flag 2023: cuộc thi CTF dành cho sinh viên các trường đại học tại Việt Nam trên toàn quốc dưới hình thức online.

Cuộc thi đã thu hút 40 đội tranh tài, là các bạn sinh viên đến từ các trường đại học công nghệ hàng đầu như Đại học Bách Khoa – Đại học Quốc gia TP.HCM, Đại học Công nghệ Thông tin – Đại học Quốc gia TP. Hồ Chí Minh, Đại học Khoa học Tự nhiên – Đại học Quốc gia TP. Hồ Chí Minh, Đại học Khoa học Tự nhiên – Đại học Quốc gia Hà Nội, Học viện kỹ thuật mật mã, Học viện Bưu chính Viễn thông, Đại học FPT, v.v…

Cuộc thi diễn ra online trên toàn quốc thu hút 40 đội thi đến từ nhiều trường đại học trên cả nước

Phát biểu khai mạc tại cuộc thi, bà Vũ Thị Đào – Trưởng phòng Khoa học công nghệ và Hợp tác phát triển Học viện Kỹ thuật mật mã – Trưởng làng Công nghệ an toàn an ninh mạng nhấn mạnh: “Cuộc thi CSTV Capture The Flag không chỉ là một hoạt động học thuật, mà còn là nơi để các bạn thể hiện kỹ năng, kiến thức và sự sáng tạo của mình trong giải quyết các thách thức về an ninh mạng. Cuộc thi này đánh dấu bước khởi đầu của hành trình của các bạn trở thành những chuyên gia và kiểm thử viên xâm nhập trong lĩnh vực an ninh mạng”.

Nội dung của đề thi lần này với các loại thử thách rất đa dạng và phong phú, bao gồm: MISC, Mobile, Cryptography, Network / Forensic, Web… Các đội thi giải đề thi liên tục trong 8 giờ đồng hồ. Chung cuộc, điểm số của các đội được cập nhật liên tục và xuất hiện nhiều bất ngờ, đã có những pha lộn ngược dòng thành công và sự tiếc nuối của nhiều thí sinh khi chưa kịp hoàn thiện. Kết quả chung cuộc, giải nhất đã thuộc về đội KCSC.firstdance (Học viện Kỹ thuật mật mã), giải Nhì thuộc về đội A.k.a.t.s.u.ki (Học viện Kỹ thuật mật mã) và hai giải ba lần lượt thuộc về đội VN1337 và RobinHust (Đại học Bách Khoa Hà Nội). Ngoài giải thưởng từ BTC của cuộc thi, các bạn sinh viên cũng sẽ nhận được nhiều cơ hội được thực tập và làm việc tại Công ty Cổ phần Nessar Việt Nam và Công ty Cổ phần An ninh mạng Việt Nam.

“Đây là lần đầu tiên Làng Công nghệ An toàn an ninh thông tin tổ chức cuộc thi CTF với quy mô lớn trên toàn quốc như vậy nhằm tạo ra một sân chơi cho các bạn sinh viên có thể tranh tài, học hỏi kinh nghiệm lẫn nhau. Cuộc thi này không chỉ có giá trị thực tiễn cao mà còn góp phần thúc đẩy đào tạo nguồn nhân lực có trình độ cao về ATTT trong công cuộc đảm bảo an toàn thông tin trên không gian mạng.” – ông Trương Đức Lượng, chủ tịch Hội đồng quản trị Công ty cổ phần An ninh mạng Việt Nam – Trưởng làng Công nghệ an toàn an ninh mạng chia sẻ trong chương trình.

Về CSTV – Cyber Security Technology Village:

Làng Công nghệ An toàn không gian mạng là thành viên của Techfest Việt Nam từ năm 2021 nhằm kết nối các Bộ/Ngành, Doanh nghiệp và Tổ chức với các đơn vị hoạt động trong lĩnh vực bảo mật tại Việt nam, xóa bỏ những rào cản vô hình khiến doanh nghiệp gặp khó khăn khi muốn tìm hiểu về an toàn thông tin, như lo ngại về chi phí, nguồn thông tin hay lượng kiến thức phức tạp, …

Làng được thành lập với sự tham gia đại diện Trưởng làng là Công ty Cổ phần An ninh mạng Việt Nam, Công ty Cổ phần Nessar Việt Nam, tổ chức Cyberkid Việt Nam và Học viện Kỹ thuật mật mã.

Trong suốt thời gian thành lập từ năm 2021 đến nay, Làng đã phối hợp với các Bộ/Ngành, các doanh nghiệp và hơn 200 thành viên hội đồng chuyên gia về bảo mật tại Việt Nam và trên thế giới tổ chức các Hội thảo, Cuộc thi về An ninh mạng đồng hành với Techfest Việt Nam. Mới đây nhất là tham gia cùng Techfest Việt Nam 2023 kết nối hệ sinh thái khởi nghiệp tại Australia và đồng hành trong sự kiện The Vietnam-Japan Autumn School on Cyber Security phối hợp với Học viện Kỹ thuật mật mã và Viện Khoa học và Công nghệ tiên tiến Nhật Bản.

Một số phương pháp xử lý ảnh cơ bản (Phần 4)

Công nghệ

Một bức ảnh màu bao gồm các kênh màu: đỏ, xanh lá cây, và xanh dương. Bạn đọc hẳn không xa lạ với các tương tác với từng điểm ảnh thông qua thao tác với mảng, ma trận numpy. Tuy nhiên, làm thế nào để ta có thể chia hình ảnh ra thành các thành phần riêng biệt?

Và các bạn có thể đoán rằng, chia trong tiếng Anh là split. Do đó, hẳn có hàm cv2.split nào đó tồn tại để làm công việc này. Trước hết, chúng ta sẽ quan sát bức ảnh phong cảnh về mùa hè dưới đây, bao gồm màu đỏ của hoa phượng hay màu xanh nước biển của bình nước trên trần tòa nhà, vân vân và mây mây. So với bức ảnh gốc, các kênh màu có sự chuyển biến giá trị màu rõ rệt trong khoảng giá trị mà chúng biểu diễn. Chúng ta sẽ cùng phân tích đoạn mã dưới đây.

Dòng 1-12, chúng ta làm tương tự như các bài học trước. Tuy nhiên, ở dòng 14, ta sẽ sử dụng hàm cv2.split để chia giá trị kênh màu vào các biến tương ứng: r, g và b. Thông thường thì chúng ta sẽ nghĩ ngay tới thứ tự RGB, tuy nhiên, opencv lưu trữ ảnh RGB như mảng numpy ở trình tự ngược lại: trình tự BGR.

Dòng 16-19 hiển thị các bức ảnh lấy ra từ kênh màu tương ứng. Bên cạnh đó, bạn đọc có thể sử dụng cv2.merge – dòng 21, để ghép các kênh màu thành bức ảnh đọc vào ban đầu bằng cách truyền vào các giá trị lấy giá theo thứ tự tương ứng lúc ta đọc ảnh.

Một phương pháp khác để hiển thị kênh màu đó là chúng ta sẽ chỉ hiển thị giá trị thực của kênh màu. Trước hết, chúng ta vẫn sử dụng cv2.split để lấy ra các giá trị thành phần của bức ảnh. Sau đó, ta tạo lại bức ảnh với cài đặt toàn bộ các điểm ảnh khác ngoài giá trị kênh màu hiện tại thì đều bằng 0. Ở dòng 24, khởi tạo một ma trận z với kích thước là bức ảnh đang xét với giá trị tất cả các điểm ảnh là 0. Tiếp đó, để có thể tạo kênh màu đỏ được biểu diễn trong ảnh, ta gọi hàm cv2.merge để ghép kênh màu đỏ với hai kênh màu còn lại nhưng có giá trị điểm ảnh bằng 0. Ta thực hiện tương tự với các trường hợp còn lại ở dòng 26-27. Như vậy, ta thu được kết quả với kênh màu mà mỗi thành phần ảnh biểu diễn như sau:

Trong chuỗi bài học đọc về thị giác máy tính qua opencv và numpy, chúng ta mới chỉ tìm hiều về hệ màu RGB, tuy nhiên trong thực tế, có rất nhiều các hệ màu khác nhau được sử dụng rộng rãi. Hệ màu HSV – Hue-Saturation-Value, rất gần với cách mà còn người nghĩ và tiếp nhận màu sắc. Bên cạnh đó còn có hệ màu L*a*b*có thể điều chỉnh cách mà chúng ta cảm nhận màu sắc. OpenCV hỗ trợ rất nhiều hệ màu trong số đó. Và việc hiểu được cách con người cảm nhận màu sắc để áp dụng cho máy tính tiếp nhận vẫn còn là một trong những bài toán được nghiên cứu sôi nổi. Chi tiết hơn thì các bạn có thể tham khảo bài viết mở đầu của chuỗi bài này để có thêm góc nhìn về cách màu sắc hoạt động. Để không đi vào chi tiết quá trình cảm nhận màu sắc, chúng ta sẽ cùng nhau tìm hiểu về cách chuyển đổi hệ màu trong OpenCV. Ngoài ra, nếu bạn đọc nghĩ thị giác máy tính nên sử dụng một hệ màu khác ngoài RGB thì hãy thử nghiệm và thảo luận với mình nhé, còn đánh giá chi tiết sẽ được trình bày ở các bài đọc sau. Bây giờ, chúng ta sẽ tìm hiều về một số hàm hỗ trợ chuyển đổi hệ màu:

Dòng 1-13, ta thực hiện khai báo thư viện, định nghĩa tham số đầu vào, đọc và hiển thị hình ảnh. Tiếp đó, ở dòng 15, chúng ta chuyển đổi ảnh từ hệ màu RGB qua ảnh xám bằng cách cài đặt cờ cv2.COLOR_BGR2GRAY. Chuyển đổi qua hệ màu HSV và L*a*b* tương tự ở dòng 18-22. Kết quả đoạn mã thu được như sau:

Vai trò của hệ màu trong xử lý ảnh và thị giác máy tính vô cùng quan trong, tuy nhiên cũng khá phức tạp. Nếu bạn đọc vừa mới bắt đầu tu luyện bộ môn này, mình nghĩ rằng nghiên cứu xoay quanh hệ màu RGB không phải là ý tồi. Hẹn gặp lại bạn đọc ở bài học sau.

Một số phương pháp xử lý ảnh cơ bản (Phần 3)

Công nghệ

Trong bài học này, chúng ta sẽ tìm hiểu về thao tác bit trên ảnh và ứng dụng của các thao tác này vào kỹ thuật masking – mặt nạ, cho phép chúng ta lọc ra vùng quan trọng, xác định vật thể trong ảnh.

1.Thao tác bit trong xử lý ảnh

Bạn đọc chắc hẳn không hề xa lạ gì khi nhắc tới các phép toán với bit. Trong trường hợp bạn là người mới tìm hiểu, thao tác bit gồm 4 phép toán sau: AND, OR, XOR và NOT. Thao tác bit hoạt động với các phép toán nhị phân gồm hai kết quả là 0, hoặc 1. Chúng ta có thể hình dung với điểm ảnh “tắt” khi giá trị của nó bằng 0, và điểm ảnh “bật” khi giá trị điểm ảnh lớn hơn 0. Chúng ta sẽ bắt đầu tìm hiểu kỹ hơn qua ví dụ sau:

dòng 1-2, ta thực hiện khai báo thư viện sử dụng, bao gồm: opencv và numpy. Tiếp đó, chúng ta khởi tạo một ma trận số 0 có kích thước 300×300 qua dòng 4. Sau đó, ta vẽ một hình vuông màu trắng có kích thước 250×250, (275 – 25 = 250), ở trung tâm bức hình. Hàm vẽ hình này đã được trình bày trong các bài viết hướng dẫn vẽ hình. Chúng ta thực hiện tương tự khi vẽ hình tròn ở dòng 8-10. Kết quả của đoạn mã:

Nhắc lại một chút về phép toán trên bit, bạn đọc có thể theo dõi qua bảng kết quả sau:

AND OR XOR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

 

NOT
0 1
1 0

 

Ở phần tiếp sau đây, chúng ta sẽ sử dụng ví dụ phía trên về hình vuông và hình tròn để thực hiện các phép toán bit

Như mình đã đề cập ở trên, điểm ảnh “bật” nếu nó có giá trị lớn hơn 0, và “tắt” khi giá trị bằng 0. Các hàm tính bit trong opencv thực hiện dựa trên các điều kiện này. Để có thể thực hiện phép tính bit, ta giả định (phần lớn trường hợp) thực hiện qua việc so sánh hai điểm ảnh (ngoại lệ duy nhất ở phép NOT). Chúng ta sẽ so sánh mỗi điểm ảnh và thực hiện biểu diễn bit như sau:

+AND: trả về là đúng – true, nếu cả hai giá trị điểm ảnh đều lớn hơn 0

+OR: trả về là đúng – true, nếu một trong hai giá trị điểm ảnh lớn hơn 0

+XOR: trả về là đúng – true, khi một trong hai giá trị điểm ảnh lớn hơn không, không bao gồm cả hai.

+NOT: thực hiện đảo ngược giá trị “bật” và “tắt” điểm ảnh

dòng 11, ta thực hiện hàm cv2.bitwise_and, phép AND giữa hình vuông và hình tròn. Như vậy, hàm này trả về là đúng khi và chỉ khi cả hai giá trị điểm ảnh đều lớn hơn 0. Kết quả bạn đọc có thể theo dõi qua hình dưới với cửa sổ AND. Chúng ta thấy rằng là các góc của hình vuông mất đi, thay thế bằng đường tròn – 0 AND 0 = 0. Kế đó là phép OR với kết quả thu được là hình vuông và hình tròn màu trắng kết hợp lại với nhau. Hai phép toán còn lại, bạn sẽ theo dõi được qua kết quả dưới đây:

 

2.Kỹ thuật mặt nạ – masking

Trong phần tìm hiểu phía trên, chúng ta đã cùng nhau tìm hiểu các hàm thao tác bit. Bây giờ, chúng ta đã sẵn sàng đi vào kỹ thuật masking – một kỹ thuật đơn giản mà vô cùng hiệu quả, phổ biến trong xử lý ảnh. Sử dụng mặt nạ cho phép chúng ta chú ý duy nhất vào một vùng trên bức ảnh. Để có thể dễ dàng hình dung hơn, hãy giả sử rằng bạn đọc muốn xây dựng một hệ thống nhận diện khuôn mặt. Vùng trên ảnh mà chúng ta muốn thu được chính là vùng chứa khuôn mặt. Do đó, việc xây dựng một mặt nạ – mask, cho phép ta hiển thị duy nhất hình ảnh khuôn mặt. Chúng ta sẽ đi vào chi tiết hơn qua ví dụ sau:

Với bức ảnh ở góc trên cùng bên trái, bạn đọc có thể thấy rằng có khá nhiều vật thể, khung cảnh diễn ra. Tuy nhiên, mình chỉ muốn lấy ra tổng quan nội dung như căn nhà cổ cùng một vài cây hoa phượng. Chúng ta có thể dễ dàng sử dụng phương pháp cắt ảnh ở bài học trước để trích xuất ra khu vực này, hoặc, chúng ta có thể sử dụng mặt nạ vào đây.

Bức ảnh trên cùng phía bên phải là mặt nạ mà mình sẽ sử dụng – hình vuông trắng ở giữa ảnh. Bằng cách sử dụng mặt nạ, chúng ta sẽ thu được bức ảnh ở phía dưới bao gồm ngôi nhà cũ kèm theo một ít hoa phượng.

Chúng ta sẽ cùng nhau xem xét đoạn mã sau đây:

Dòng 1-13, ta thực hiện các thao tác quen thuộc: khai báo thư viện, định nghĩa tham số truyền vào, và hiển thị bức ảnh.

Tiếp đó, chúng ta tạo một mặt nạ – mask, với kích thước như bức ảnh truyền vào – dòng 15. Để có thể vẽ được hình vuông, trước hết chúng ta cần tính tọa độ tâm của hình ảnh đầu vào bằng cách chia đôi chiều ngang và chiều dọc qua dòng 16. Cuối cùng, ta vẽ tứ giác ở dòng 17.

Bạn đọc nhớ lại hàm bitwise_and ở phần 1, đây là một hàm được sử dụng thường xuyên khi chúng ta đặt mặt nạ vào bức ảnh cần xử lý – thực hiện tại dòng 21. Phép AND trả về là true – đúng, với tất cả giá trị trong ảnh gốc, tuy nhiên, phần quan trọng là từ khóa mask. Bằng cách sử dụng từ khóa mask, cv2.bitwise_and sẽ xử lý điểm ảnh “bật” trong mặt nạ – trong ví dụ là phần hình vuông màu trắng trong mặt nạ. Chúng ta sẽ theo dõi thêm một ví dụ nữa tương tự khi thay phần “bật” trong mặt nạ thành hình tròn:

Như vậy, ảnh thu được sau khi áp dụng mặt nạ có thể là đa giác, mà cũng có thể là hình tròn tùy theo việc bạn đọc cài đặt điểm “bật” trong mặt nạ. Kỹ thuật này hiện tại có vẻ không thú vị lắm so với việc ta có thể sử dụng ngay phương pháp cắt ảnh, tuy nhiên bạn đọc sẽ quay lại đây khi chúng ta bàn luận tới histograms. Các điểm quan trọng trong mặt nạ giúp việc tính toán vào vùng mà chúng ta chọn lựa dễ dàng hơn rất nhiều ở các bài học tiếp theo.

Một số phương pháp xử lý ảnh cơ bản (Phần 2)

Công nghệ Uncategorized

Qua các bài học trước, bạn đọc hẳn đã nắm được cách thực hiện một số biến đổi cơ bản lên ảnh số. Trong bài học này, chúng ta sẽ cùng nhau tìm hiểu thêm phép toán cộng, trừ trong xử lý ảnh. Nếu bạn đọc còn nhớ, khi làm việc với ảnh số, chúng ta cần lưu ý các giới hạn về hệ màu và loại dữ liệu. Có thể kể đến như ảnh RGB có giá trị các điểm ảnh trong khoảng [0, 255]. Vậy khi ta tăng điểm ảnh có giá trị hiện tại là 250 thêm 10 đơn vị thì điều gì sẽ xảy ra? 

Bằng việc thực hiện tính toán như bình thường 250 + 10 = 260. Tuy nhiên, ảnh RGB được biểu diễn qua 8-bit số nguyên nên 260 là giá trị không hợp lệ. Để có thể giải đáp được trường hợp này, chúng ta sẽ thử nghiệm qua ví dụ sau:

Dòng 1-13 thực hiện các chức năng: khai báo thư viện, định nghĩa tham số, đọc và hiển thị hình ảnh như ở các bài học trước. Từ dòng 15 tới dòng 19, chúng ta sẽ kiểm tra xem khi giá trị tính toán vượt quá ngưỡng định nghĩa của ảnh thì điều gì sẽ xảy ra.

Thử nghiệm đầu tiên với hai hàm cv2.add và cv2.subtract. Như tên gọi của hai hàm này, ta thực hiện cộng và trừ hai mảng với nhau. Với trường hợp phép cộng, chúng ta thực hiện tính tổng hai giá trị 200 và 100, còn trường hợp phép trừ, ta thực tính hiệu 50 – 100. Vậy hai phép toán đơn giản này bạn đọc có thể dễ dàng nhẩm ra kết quả là 300 cho phép cộng, và -50 cho phép trừ. Ta cùng xem kết quả trả về của đoạn mã:

Kết quả trả về khi thực hiện hai hàm cv2.add và cv2.subtract lần lượt là 255 và 0. Như vậy, với giá trị vượt quá ngưỡng cho phép, opencv sẽ trả về kết quả bằng với ngưỡng lớn nhất hoặc nhỏ nhất như định nghĩa kiểu dữ liệu sử dụng. Tuy nhiên, Numpy không xử lý như hai hàm opencv. Ở dòng 18-19, chúng ta sẽ thấy kết quả trả về khi vượt quá giá trị tối đa của kiểu dữ liệu như sau:

Giá trị dự đoán của bạn đọc là 300 do 200 + 100 như tính toán thông thường. Ta có thể thấy rằng 300 – 256 = 44 và 256 – 50 = 206. Chúng ta thấy rằng khi kết quả vượt qua ngưỡng giới hạn thì phần dư ra sẽ được đếm lại từ 0.

Tiếp đó, chúng ta áp dụng thử việc thêm, và lược bớt điểm ảnh:

Dòng 21, ta định nghĩa một mảng Numpy có cùng kích thước với bức ảnh muốn chỉnh sửa. Bạn đọc chú ý rằng, ma trận này phải cùng kiểu dữ liệu với bức ảnh gốc. Ở đây ngoài việc tạo ra một ma trận cùng kích thước ảnh gốc – trong đó mỗi giá trị trong ma trận này đều là 1 do việc khởi tạo np.ones, ta tăng giá trị ma trận khởi tạo này lên 200 lần – mỗi phần tử trong ma trận s1 giờ có giá trị là 200. Sau khi khởi tạo thành công, ta thực hiện phép cộng cv2.add giữa ảnh gốc và ma trận tạo mới. 

Ngay từ bài học đầu tiên, bạn học hẳn đã có thể dự đoán kết quả dòng 21-23 sẽ thu về một bức ảnh sáng hơn ảnh gốc – giá trị gần 255 thì gần màu trắng, giá trị gần 0 thì gần màu đen. Kết quả của đoạn mã thu được như sau:

Chúng ta thấy rằng khi tăng giá trị điểm ảnh lên thì bức ảnh trở nên sáng hơn, ngược lại khi giảm giá trị điểm ảnh thì bức ảnh trở nên tối, đậm hơn. Trong bài học tới, bạn đọc và tôi sẽ cùng nhau tìm hiểu thêm về phép toán nhị phân trong xử lý ảnh.

Một số phương pháp xử lý ảnh cơ bản (phần 1)

Công nghệ

Qua các bài học trước, chúng ta đã nắm được các thao tác xử lý cơ bản với ảnh số và cách tương tác, thay đổi giá trị của từng điểm ảnh. Trong nhóm bài này, bạn đọc và tôi sẽ cùng nhau tìm hiểu thêm một số phương pháp biến đổi ảnh số cơ bản như: phép dịch, phép xoay, thay đổi kích thước, lật ảnh hay cắt ảnh số.

1.Phép dịch

Phương pháp đầu tiên mà chúng ta sẽ tìm hiểu là phép dịch ảnh. Phép dịch cho phép dịch chuyển bức ảnh, hay nói cách khác là dịch chuyển ma trận theo trục tung, và trục hoành. Bằng cách sử dụng phương pháp này, bức ảnh có thể dễ dàng di chuyển lên, xuống, qua trái, qua phải theo cách mà chúng ta mong muốn. Ta sẽ cùng nhau phân tích cách sử dụng dưới đây:

Dòng 1-13, khai báo thư viện sử dụng, và định nghĩa tham số truyền vào và đọc ảnh như ví dụ đã được trình bày trong các bài học trước.

Phép dịch ảnh được thực hiện dòng 15-17. Chúng ta bắt đầu bằng định nghĩa dịch chuyển là s1 – ma trận chứa thông tin về số điểm ảnh ta muốn dịch chuyển qua phải hoặc trái, lên trên hoặc xuống dưới. Thông tin này sau đó sẽ được áp dụng vào bức ảnh cần thực hiện biến đổi.

Ta có thể thấy rằng cấu trúc định nghĩa dịch chuyển là một ma trận gồm 2 thành phần:

[1, 0, tx]: tx là số lượng điểm ảnh ta muốn dịch bức ảnh qua trái hoặc phải. tx < 0 sẽ dịch bức ảnh qua trái và tx > 0 sẽ dịch bức ảnh phải

[0, 1, ty]: ty là số lượng điểm ảnh ta muốn dịch bức ảnh lên trên hoặc xuống dưới, ty < 0 dịch bức ảnh lên trên và ngược lại

Như vậy, chúng ta thấy rằng định nghĩa tx = 25 và ty = 50 sẽ dịch bức ảnh qua 25 điểm ảnh về phía bên phải và dịch bức ảnh xuống 50 điểm ảnh.

Sau khi định nghĩa ma trận dịch chuyển, phép dịch sẽ được chính thức thực hiện ở dòng 16 qua hàm cv2.warpAffine. Tham số đầu tiên hàm này nhận vào là bức ảnh ta muốn biến đổi, sau đó là ma trận dịch được định nghĩa – s1. Cuối cùng là tham số về chiều của bức ảnh đầu vào (số cột và số dòng). Bạn đọc có thể thử nghiệm thêm nhiều cách dịch khác nhau như ví dụ dòng 19-21. Kết quả chúng ta thu được như sau:

2.Phép xoay

Phương pháp thứ hai chúng ta tìm hiểu là phép xoay ảnh. Phương pháp này cho phép ta xoay ảnh theo một góc độ được định nghĩa

Dòng 1-13 định nghĩa và đọc ảnh như ở các ví dụ trước. Để có thể xoay một bức ảnh, chúng ta đặc biệt cần chú ý tìm ra tọa độ tâm mà ta muốn xoay bức ảnh, do đó opencv hỗ trợ người dùng định nghĩa dễ dàng tâm điểm này. Dòng 15-16, ta lấy kích thước bức ảnh và chia đôi để được tọa độ điểm chính giữa của bức ảnh. Thay vì phải định nghĩa ma trận xoay numpy như ở phép dịch, opencv cung cấp hàm cv2.getRotationMatrix2D – nhận 3 tham số đầu vào gồm tọa độ tâm điểm ta muốn xoay hình, sau đó là giá trị góc ta muốn xoay từ tâm và cuối cùng là kích thước bức ảnh.

Như vậy, với tham số thứ hai là 45, ta hiểu rằng bức ảnh ban đầu được xoay theo góc 45 độ và hình ảnh xoay giữ nguyên kích thước ban đầu khi tham số thứ ba là 1.0 và bị chia đôi khi bằng 0.5 hay gấp đôi với giá trị là 2.0. Tuy nhiên việc thay đổi kích thước ảnh sẽ được bàn luận ở phần sau của bài học.

Khi mà ta đã có được ma trận định nghĩa phép xoay, ta thực hiện biến đổi ảnh qua hàm cv2.warpAffine ở dòng 19. Kết quả mà chúng ta thu được như sau:

3.Thay đổi kích thước

Sau phép dịch và phép xoay ảnh, chúng ta sẽ tiếp tục tìm hiểu phương pháp thay đổi kích thước ảnh. Chắc hẳn bạn đọc không hề xa lạ với hàm cv2.resize, tuy nhiên chúng ta sẽ nghiên cứu kĩ hơn về các tham số sử dụng trong hàm qua ví dụ sau:

Dòng 1-13 thực hiện thao tác quen thuộc: khai báo thư viện, định nghĩa tham số, đọc và hiển thị bức ảnh. Phần thú vị bắt đầu ở dòng 15-16, để có thể thay đổi kích thước ảnh số, chúng ta cần chú ý tới tỉ lệ khung hình – mối quan hệ giữa số hàng và số cột của ma trận biểu diễn hình ảnh. Nếu bạn đọc không chú ý tới hai yếu tố này, sai sót trong tỉ lệ khung hình thay đổi kích thước sẽ dẫn đến kết quả ảnh hiển thị không theo ý muốn.

Việc tính toán tỉ lệ khung hình được xử lý tại dòng 15. Ở đây, chúng ta định nghĩa ảnh mới có số cột là 200 điểm ảnh. Để có thể tính tỉ lệ khung hình – số hàng ma trận mới so với hiện tại, ta định nghĩa giá trị r = 200 chia số cột – rs_img.shape[1]. Khi đã có tỉ lệ khung hình, chúng ta tính chiều của bức ảnh sau khi thay đổi kích thước qua dòng 16. Như vậy, ta thu được số cột ở ảnh mới là 200, ta tìm số hàng của ma trận mới bằng cách nhân giá trị hàng ma trận cũ với tỉ lệ r

Bức ảnh được thay đổi kích thước thực hiện ở dòng 18, qua hàm cv2.resize. Tham số đầu tiên là bức ảnh gốc bạn muốn thay đổi kích thước, tham số thứ hai là kích thước ảnh mới và cuối cùng là phương thức interpolation – thuật toán thực hiện thay đổi kích thước ảnh. Bạn đọc có thể thay thế cv2.INTER_AREA bằng một số tùy chọn khác như cv2.INTER_LINEAR, cv2.INTER_CUBIC hay cv2.INTER_NEAREST. Bên cạnh đó, bạn cũng có thể thay đổi kích thước bức ảnh theo tỉ lệ giữa số hàng và số cột ma trận hoặc ngược lại. Kết quả chúng ta thu được sau khi thay đổi kích thước bức ảnh với hai trường hợp: số cột = 200 và số hàng 100

4.Lật ảnh

Nếu bạn đọc thắc mắc làm thế nào để tạo hình ảnh như đổ bóng, hay hình ảnh phản chiếu thì phép lật ảnh sẽ hỗ trợ bạn thực hiện các tác vụ này. Phép dịch ở trên cho phép ta di chuyển toàn bộ bức ảnh theo hệ tọa độ, thì phương pháp lật ảnh mà opencv hỗ trợ giúp ta lật ảnh qua lại quanh trục tọa độ. Chúng ta bắt đầu ngay với ví dụ sau:

Chúng ta sẽ bắt đầu ngay vào với hàm cv2.flip dòng 15, phương thức này nhận vào hai tham số: đầu tiên là bức ảnh ta muốn lật, và thứ hai là flip code sử dụng để quyết định ta sẽ lật bức ảnh theo cách nào.

Ý nghĩa giá trị flip code:

0: lật bức ảnh theo trục tung

1: lật bức ảnh theo trục hoành

-1: lật bức ảnh theo cả hai trục

Đây có lẽ là phương pháp biến đổi cơ bản nhất mà chúng ta tìm hiểu. Sau khi thực thi, chúng ta thu được kết quả sau:

5.Cắt ảnh

Để có thể loại bỏ các thành phần thừa trong một bức ảnh, ta sử dụng phương pháp cắt ảnh. Phương pháp này rất quen thuộc với bạn đọc và đã được đề cập trong bài học trước. Chúng ta thực hiện cắt ảnh thông qua sự hỗ trợ từ thư viện numpy bằng việc khai báo tọa độ vùng mà ta muốn giữ lại

Quá trình cắt ảnh được thực hiện ở dòng 15, chúng ta thực hiện việc định nghĩa tọa hình chữ nhật cắt ảnh từ tọa độ bắt đầu từ (100,10) tới (220,80). Ta cần cung cấp 4 giá trị để có thể thực hiện phương pháp cắt ảnh:

y – bắt đầu: trục tung, y = 10

y – kết thúc: trục tung, y = 80

x – bắt đầu: trục hoành, x = 100

x – kết thúc: trục hoành, x = 220

Như vậy, ta có thể cắt được vùng ảnh chứa đầu của gundam astray red:

Ở bài tiếp theo, chúng ta sẽ cùng nhau tìm hiểu một số phép toán trên ảnh.

Làm quen với Histogram trong OpenCV

Công nghệ

Đến với bài viết này, chúng ta sẽ làm quen với một khái niệm mới là histograms – biểu đồ. Vậy histograms là gì? Đây là một dạng biểu đồ thể hiện tần suất, nó mô tả một cách đơn giản mà không làm mất bất cứ thống kê thông tin nào của dữ liệu. Trong xử lý ảnh, biểu đồ này biểu thị cường độ phân bố điểm ảnh (cho dù là ảnh màu hay ảnh xám). Biểu đồ có thể được biểu diễn dạng đường hoặc dạng cột, nhờ đó mà nó cung cấp hình ảnh trực quan về mức độ phân bố giá trị điểm ảnh. Ngoài ra, histograms còn chứa các thông tin về kiểu phân bố dữ liệu, độ rộng dữ liệu, đánh giá tính đối xứng của dữ liệu và cho thấy dữ liệu nằm ngoài phân bố. Trong phạm vi bài học này, chúng ta sử dụng không gian màu RGB, do đó giá trị điểm ảnh sẽ nằm trong khoảng từ 0 tới 255.

Bằng cách vẽ biểu đồ, ta hãy tưởng tượng trục x như là các ngăn chứa khác nhau. Nếu chúng ta vẽ biểu đồ có 256 ngăn chứa, thì chúng ta đang xếp lần lượt từng giá trị điểm ảnh vào một ngăn tương ứng và trục y sẽ cho ta biết số lần xuất hiện của từng giá trị trong mỗi ngăn xếp. Ngoài ra nếu chúng ta chỉ chia thành 2 ngăn xếp thì các giá trị có thể được xếp vào hai ngăn tương ứng [0,128) hoặc [128,255]. Cuối cùng thì số lượng trong mỗi ngăn xếp sau đó được biểu thị trên trục y. Có thể bạn đọc vẫn đang đặt ra câu hỏi rằng tại sao chúng ta cần nắm được ý nghĩa của biểu đồ trong xử lý ảnh. Khi ta phân tích histograms – biểu đồ phân bố điểm ảnh, ta sẽ có được các thông tin về độ tương phản, độ sáng và cường độ phân bố các giá trị

Chúng ta sẽ cùng nhau bắt tay vào tạo một biểu đồ với bức ảnh yêu thích và phân tích xem có thể thu thập được những thông tin hay ho nào. 

Để có thể tạo một biểu đồ của bức ảnh với opencv, ta sử dụng hàm cv2.calcHist, trong đó:

cv2.calcHist(images, channels, mask, histSize, ranges):

a.images: bức ảnh ta muốn tạo biểu đồ

b.channels: danh sách các chỉ mục tính biểu đồ. Giá trị là 0 với ảnh xám. Với ảnh màu, giá trị là [0,1,2] tương ứng R, G, và B

c.mask: khái niệm mặt nạ bạn đọc đã được tìm hiểu trong bài học trước, khi cung cấp tham số này, biểu đồ sẽ chỉ hiển thị giá trị nằm trong mặt nạ định nghĩa. Nếu không muốn sử dụng mặt nạ thì ta để là None

d.histSize: số lượng ngăn xếp ta muốn sử dụng để tính toán biểu đồ. Tham số này là một list – danh sách, và một cho mỗi kênh màu chúng ta thực hiện tính toán, và không nhất thiết các tham số phải bằng nhau. Ví dụ mình muốn tạo biểu đồ kích thước 32 ngăn xếp cho mỗi kênh màu thì sẽ khai báo là [32,32,32]

e.ranges: tại đây chúng ta sẽ chỉ định phạm vi có thể của điểm ảnh. Thông thường, giá trị này trong khoảng [0,256] cho mỗi kênh màu, tuy nhiên nếu bạn sử dụng hệ màu khác ngoài RGB (như HSV chẳng hạn), thì khoảng giá trị này sẽ có chút khác biệt. 

Sau đây, ta sẽ cùng nhau tìm hiểu cách tạo biểu đồ với ảnh xám và ảnh màu.

1.Tạo biểu đồ ảnh xám

Dòng 1-14, chúng ta thực hiện thao tác tương tự như các bài học trước: khai báo thư viện, định nghĩa tham số, đọc ảnh truyền vào và hiển thị bức ảnh. Tuy nhiên, điểm khác biệt dòng 12, ta thực hiện chuyển đổi bức ảnh truyền vào từ ảnh màu thành ảnh xám, và chúng ta sẽ tìm hiểu thêm một thư viện mới là matplotlib – đây là một thư viện hỗ trợ mạnh trong quá trình vẽ đồ thị. Ở dòng 16, chúng ta bắt tay vào tính biểu đồ qua sử dụng hàm cv2.calcHist. Như bạn đọc có thể thấy, tham số đầu tiên là biến số rs_img chứa bức ảnh xám. Do ảnh xám có duy nhất một kênh màu, do đó tham số thứ hai mà ta truyền vào là [0] kênh màu. Ngoài ra, chúng ta không sử dụng mặt nạ nên tham số tiếp theo truyền vào hàm là None. Tiếp đến là chúng ta sử dụng 256 ngăn chứa – 256 nhóm giá trị và khoảng giá trị từ 0 tới 256 phù hợp.

Cuối cùng, ta gọi plt.plot() để hiển thị biểu đồ và kết quả cuối cùng bạn đọc sẽ tìm thấy phía dưới đây. Biểu đồ cho thấy giá trị điểm ảnh tập trung trong khoảng từ 0 tới 50.

2.Tạo biểu đồ ảnh màu

Ở ví dụ trên, chúng ta đã nắm được cách tạo biểu đồ ảnh xám, bây giờ bạn đọc và tôi sẽ tìm hiểu cách tính phân bố điểm ảnh cho từng kênh màu trong ảnh

Ở đoạn mã nguồn này chúng ta cần để ý những đoạn sau:

Điều đầu tiên khi ta muốn tạo biểu đồ phân bố giá trị điểm ảnh ở ảnh màu chính là phân tách giá trị ảnh màu ra thành 3 kênh màu: b, g và r – dòng 16. Thông thường, chúng ta đọc hệ màu RGB theo thứ tự lần lượt là r,g và b. Tuy nhiên, opencv lưu ảnh ở dạng mảng numpy theo thứ tự ngược lại: BGR – bạn đọc nên chú ý thứ tự này để có thể xử lý chính xác. Tiếp đó, ta tạo biến colors lưu giá trị các màu biểu thị ở dòng 17.  

Dòng 18-21, khởi tạo và hiển thị biểu đồ với chú thích tương ứng.

Tiếp đó, dòng 23, ta thực hiện vòng lặp chạy qua từng kênh màu. Với mỗi kênh màu, chúng ta tính giá trị hiển thị lên biểu đồ theo phân bố giá trị điểm ảnh tương ứng. Kết quả biểu đồ phân bố thu được như sau: 

Như vậy, chúng ta đã có thể tính biểu đồ lần lượt qua từng kênh màu. Bây giờ, chúng ta sẽ chuyển qua biểu đồ đa chiều và xem xét tính toán hai kênh màu một lúc. Ví dụ, bạn đọc có thể có các câu hỏi như là “Có bao nhiêu điểm ảnh có giá trị đỏ là 10 và xanh là 30?”. Bạn đọc theo dõi minh họa sau:

Bạn đọc có thể thấy rằng mã nguồn ví dụ này khá là dài, tuy nhiên đây là do chúng ta đang thực hiện tính toán biểu đồ màu sắc 2D cho mỗi kết hợp của kênh màu RGB: B&R, G&R, G&B. Như vậy, bây giờ chúng ta đang làm việc với biểu đồ đa chiều. Ở ví dụ trước, mình sử dụng 256 nhóm để làm ví dụ. Tuy nhiên, nếu chúng ta sử dụng 256 nhóm để biểu diễn biểu đồ 2 chiều thì chúng ta sẽ thu về một biểu đề có số lượng 256×256=65536 điểm ảnh riêng biệt. Điều này gây lãng phí bộ nhớ và không thực tiễn. Phần lớn các ứng dụng sử dụng trong khoảng 8 tới 64 nhóm để tính biểu đồ đa chiều. Dòng 32-33, mình sử dụng 32 nhóm thay vì 256. Bạn đọc có thể dễ dàng thấy rằng tham số đầu tiên cho hàm cv2.calcHist nhận vào mảng gồm giá trị hai kênh màu là G và B, hai tổ hợp còn lại cách triển khai tương tự. Vậy biểu đồ 2D được opencv xử lý như thế nào? Khá đơn giản, đó chỉ là mảng numpy hai chiều. Do đó, khi ta chọn cách chia thành 32 nhóm, ta thu được biểu đồ 32×32. Cách biểu đồ hiển thị trực quan bạn đọc có thể tham khảo ở kết quả dưới đây. Đầu tiên là biểu đồ gồm hai kênh màu G và B, tiếp đó là G và R, cuối cùng là B và R. Sắc thái xanh lam biểu diễn điểm ảnh có giá trị nhỏ, còn sắc đỏ biểu thị điểm ảnh có giá trị lớn

Cuối cùng, chúng ta tiếp tục xây dựng một biểu đồ 3 chiều kết hợp cả 3 kênh màu RGB:

Đoạn mã khá đơn giản sau khi chúng ta mở rộng mã từ các phần trên. Dòng 58, ta tính biểu đồ 8x8x8 ở mỗi kênh màu.

3.Cân bằng biểu đồ

Cân bằng biểu đồ là phương pháp cải thiện độ tương phản của bức ảnh bằng cách kéo dãn phân bố điểm ảnh. Bạn đọc có thể thấy ở các ví dụ trên, phân bố điểm ảnh không đồng đều là tập trung chủ yếu ở một số đỉnh có giá trị nhất định. Bằng việc kéo dãn phân bố giá trị này, bức ảnh có thể trở nên sáng hơn. Phương pháp này rất hữu ích khi bức ảnh có nền và trung tâm đều sáng hoặc đều tối – điều mà gây ra cách hiệu ứng xấu trong nhiếp ảnh. Ngoài ra, phương pháp này còn được sử dụng rộng rãi với đối tượng là ảnh vệ tinh và ảnh chụp y học. Trước tiên, chúng ta sẽ cùng nhau tham khảo ví dụ sau:

Dòng 1- 13, tương tự các ví dụ trước, nhưng ở dòng 12, chúng ta thực hiện biến đổi ảnh màu đầu vào về ảnh xám. Phương pháp cân bằng biểu đồ được thực hiện ở dòng 15 qua hàm hỗ trợ cv2.equalizeHist từ opencv với tham số nhận vào duy nhất là biến số được định nghĩa chứa ảnh xám. Kết quả đạt được với ảnh gốc chuyển xám ở phía bên trái, và ảnh được áp dụng phương pháp ở bên phải

Sau khi kéo dãn giá trị bằng phương pháp cân bằng đồ thị, bức ảnh trở nên sáng hơn – ảnh phải.

4.Biểu đồ và mặt nạ

Ở bài học trước, mặt nạ có thể được sử dụng để tập trung vào một vùng trên ảnh mà chúng ta quan tâm. Bây giờ, chúng ta sẽ xây dựng một mặt nạ và tính toán biểu đồ cho vùng ảnh áp dụng mặt nạ

 

Dòng 1-4, chúng ta khai báo các thư viện cần sử dụng. Dòng 6, ta định nghĩa hàm plot_histogram nhận vào 3 tham số là img, title và mask, trong đó img: ảnh, title: tên khung và mask: mặt nạ với giá trị mặc định là None. Phần thân hàm chúng ta đơn giản là thực hiện vẽ biểu đồ như các ví dụ trên cho mỗi kênh màu

Dòng 21-29, ta định nghĩa tham số truyền vào, đọc ảnh và hiển thị ảnh gốc. Sau đó, chúng ta gọi hàm plot_histogram để hiển thị biểu đồ của bức ảnh. Kết quả thu được:

Sau đó, ta xây dựng mặt nạ bằng cách định nghĩa ma trận giá trị 0 với numpy có cùng kích thước với bức ảnh xử lý – dòng 32. Sau đó, chúng ta vẽ đa giác với tọa độ bắt đầu là (15,15) tới tọa độ kết thúc là (130, 100) ở dòng 33. Đa giác này sẽ được sử dụng làm mặt nạ, lấy ra giáp vai của gundam. Để có thể biểu diễn và áp dụng mặt nạ này, ta thực hiện phép AND.

Chúng ta thấy rằng, ảnh góc trên cùng bên phải là mặt nạ sử dụng và giáp vai thu được nằm ở phía dưới bên phải. Cuối cùng, chúng ta đánh giá biểu đồ sau khi áp dụng mặt nạ

Bằng cách áp dụng mặt nạ, chúng ta có thể áp dụng tính toán vào vùng mà ta mong muốn trên bức ảnh, ví dụ như chúng ta muốn phân tích phân bố màu sắc trên giáp vai của gundam chẳng hạn. Như vậy, sau bài học này, bạn đọc đã có cái nhìn toàn cảnh về những hỗ trợ biểu đồ mà opencv đem lại. Đây là một chủ đề khó và có ứng dụng rộng rãi. Chúng ta sẽ còn nhắc lại nội dung ở đây trong những bài học tiếp theo.

 

Làm quen với Thresholding trong OpenCV

Công nghệ

Trong bài đọc này, chúng ta sẽ tìm hiểu về ngưỡng ảnh. Thông thường, đây là phương pháp mà chúng ta sẽ sử dụng khi muốn chuyển đổi từ ảnh xám thành ảnh nhị phân – giá trị các điểm ảnh là 0 hoặc 1. Bạn đọc hẳn còn nhớ, ảnh xám bao gồm các điểm ảnh có giá trị trong khoảng từ 0 tới 255, phương pháp xét ngưỡng cơ bản để có thể chuyển đổi qua ảnh nhị phân đó là chúng ta chọn một giá trị điểm ảnh là p, và cài đặt toàn bộ điểm ảnh có giá trị nhỏ hơn p thành giá trị 0, những điểm ảnh còn lại mang giá trị 1. Như vậy, chúng ta đã thu được một bức ảnh nhị phân từ ảnh xám

Ảnh xám

Ảnh nhị phân
Việc chúng ta áp dụng xét ngưỡng trong xử lý ảnh nhằm tập trung vào các đối tượng hoặc vùng ảnh cụ thể mà ta quan tâm. Bạn đọc sẽ thấy rõ ràng hơn qua ví dụ tìm đồng xu trong bức ảnh dưới đây.
1.Phương pháp xét ngưỡng cơ bản
Phương pháp cơ bản đầu tiên mà chúng ta tìm hiểu sẽ khá thủ công, phụ thuộc phần lớn vào bản thân bạn đọc. Trước hết, ta cần định nghĩa giá trị ngưỡng là T. Tất cả điểm ảnh có giá trị nhỏ hơn T được cài đặt giá trị mới là 0, và tất cả điểm ảnh lớn hơn T cài đặt giá trị mới là 255. Bạn đọc cũng có thể cài đặt giá trị ngược lại do ảnh nhị phân chỉ gồm hai giá trị là 0 và 1 như mình đã trình bày trong những bài mở đầu. Ta sẽ cùng nhau xem xét ví dụ sau:

Dòng 1-15, chúng ta thực hiện các thao tác quen thuộc: khai báo thư viện, định nghĩa tham số đầu vào, thay đổi kích thước và hiển thị hình ảnh. Trong đó, dòng 13 thực hiện chuyển đổi ảnh đầu vào hệ màu RGB thành ảnh xám. Tiếp đó ở dòng 14, ta áp dụng kỹ thuật làm mờ Gaussian trong bài học trước giúp loại bỏ một số đường nét từ đồng xu.

 


AnhDemo: Bức ảnh đầu vào sau khi chuyển đổi từ hệ màu RGB thành ảnh xám
Threshold Binary: áp dụng ngưỡng nhị phân cơ bản, đồng xu hiển thị có màu đen và nền trắng
Threshold Binary Inverse: áp dụng nghịch đảo kết quả threshold binary. Đồng xu mang giá trị điểm ảnh ngược lại có màu trắng, nền từ trắng chuyển thành đen
Coins: Áp dụng mặt nạ là kết quả threshold binary inverse trong ảnh xám. Chúng ta thu được ảnh cuối tập trung vào duy nhất các đồng xu.
Sau khi áp dụng kỹ thuật làm mờ ảnh, ta tính toán ngưỡng ảnh qua hàm cv2.threshold tại dòng 17. Hàm này nhận vào 4 tham số: thứ nhất là ảnh xám mà ta muốn áp dụng xét ngưỡng – ta cung cấp ảnh xám đã được xử lý làm mờ cho tham số này. Tiếp đó, chúng ta cung cấp giá trị ngưỡng chọn thủ công T = 155. Tham số thứ ba là ngưỡng tối đa mà ta áp dụng. Tất cả các điểm ảnh có giá trị p lớn hơn T sẽ mang giá trị tham số thứ ba này. Và tất giá trị nhỏ hơn 155 sẽ được cài đặt là 0. Cuối cùng, chúng ta cung cấp phương thức ngưỡng: cv2.THRESH_BINARY để thực hiện thay đổi các giá trị điểm ảnh theo ngưỡng cung cấp từ các tham số phía trước.
Hàm cv2.threshold trả về hai giá trị: T và ảnh đã được biến đổi theo ngưỡng cài đặt. Kết quả thu được như bạn đọc có thể theo dõi ở hình trên cùng phía bên phải: đồng xu có màu đen và nền trắng.
Qua dòng 20, ta áp dụng ngưỡng đảo ngược cho ảnh qua phương thức cv2.THRESH_BINARY_INVERSE và thu được kết quả là đồng xu màu trắng nền đen. Cuối cùng, để có thể thu được kết quả chỉ bao gồm những đồng xu từ bức ảnh ban đầu, ta thực hiện tác vụ ở dòng 23 bằng cách sử dụng cv2.bitwise_and. Ta cung cấp ảnh cần lọc xu cho tham số thứ nhất và mặt nạ sử dụng là kết quả áp dụng ngưỡng đảo ngược. Kết quả cuối cùng ta thu được bức ảnh chỉ gồm giá trị điểm ảnh của các đồng xu. Ứng dụng phương pháp này bạn đọc hẳn không còn xa lạ gì khi xem các streamer xóa nền và chỉ hiển thị khuôn mặt khi tương tác.
2.Phương pháp ngưỡng thích ứng
Một trong những nhược điểm của việc xét ngưỡng cơ bản hẳn bạn đọc có thể dễ dàng nhận thấy chính là việc phải chọn giá trị T một cách thủ công, cảm tính hoặc phải qua nhiều lần cài đặt để tìm ra giá trị phù hợp cho bài toán. Phương pháp thứ hai mà mình giới thiệu không chỉ tìm ra giá trị T mà còn hỗ trợ nhiều cài đặt tinh chỉnh tham số. Áp dụng ngưỡng thích ứng hoạt động trên cơ chế tìm giá trị tối ưu T của các điểm ảnh lân cận.

Từ dòng 1-15, ta thực hiện tương tự phương pháp thứ nhất. Chúng ta áp dụng ngưỡng thích ứng ở dòng 17 qua hàm cv2.adaptiveThreshold với tham số thứ nhất là bức ảnh ta muốn áp dụng ngưỡng, tham số thứ 2 cung cấp giá trị điểm ảnh tối đa áp dụng ngưỡng – 255 như ở ngưỡng cơ bản. Tham số thứ ba mà chúng ta cung cấp là cv2.ADAPTIVE_THRESH_MEAN_C – tính T bằng trung bình giá trị các điểm ảnh lân cận. Tiếp theo là phương thức cài đặt ngưỡng để chuyển đổi ánh xám qua ảnh nhị phân, sau đó, ta cung cấp kích thước vùng xét ngưỡng – giá trị này phải là số lẻ. Ở đây, 11 nghĩa là ta sẽ xét vùng áp dụng ngưỡng có kích thước 11×11 thay vì toàn bộ bức ảnh như phương pháp thứ nhất.Tham số cuối cùng là C – giá trị trừ đi từ giá trị trung bình để điều chỉnh ngưỡng. Kết quả thu được như sau:

Tổng quan, chúng ta thấy rằng ở phương pháp thứ hai, việc lựa chọn ngưỡng trung bình hay ngưỡng theo Gauss thì vẫn yêu cầu một số tham số cuối phụ thuộc vào quá trình thực nghiệm. Tham số quan trọng nhất ở phương pháp này chính là kích thước vùng lân cận xét T và giá trị hiệu chỉnh C. Bằng cách thử nghiệm các tham số này, bạn đọc sẽ tìm ra cách xử lý ảnh phù hợp nhất với từng bài toán.
3.Phương pháp Otsu và Riddler-Calvard
Một phương pháp khác giúp bạn đọc có thể tự động tính toán ngưỡng T chính là phương pháp Otsu. Phương pháp này giả sử tồn tại hai đỉnh trong biểu đồ ảnh xám (bạn đọc hẳn còn nhớ kiến thức trong bài histograms chứ?), khi đó, bằng cách tìm giá trị tối ưu giữa hai đỉnh này, ta thu được ngưỡng T. Chúng ta sẽ tìm hiểu thực nghiệm phương pháp này qua thư viện mahotas

 

Dòng 1-16, ta thực hiện tương tự các ví dụ trên. Để có thể tìm được ngưỡng T phù hợp, chúng ta sử dụng hàm mahotas.thresholding.otsu với tham số truyền vào là bức ảnh cần xử lý, và như vậy ta đã thu được giá trị T = 187


Để có thể thu được kết quả của phương pháp Otsu, ta thực hiện từ dong 21-25. Trước hết, ta tạo một bản sao từ ảnh xám để có thể áp dụng ngưỡng. Dòng 22 thay đổi tất cả giá trị lớn hơn T thành màu trắng, và dòng 23 làm điều ngược lại – thay đổi các giá trị nhỏ hơn T thành màu đen. Cuối cùng, ta áp dụng cv2.bitwise_not để áp dụng ngưỡng vào bức ảnh – bạn đọc tham khảo thêm trong bài viết về phép toán bit, sau đó ta hiển thị kết quả ở dòng 25. Bạn đọc thực hiện tương tự với phương pháp Riddler-Calvard dòng 27-34.

Xác định đường viền trong ảnh số

Công nghệ Uncategorized

Trong bài viết này, chúng ta sẽ cùng nhau sử dụng những điểm cạnh phát hiện được để tìm ra đồng xu trong bức ảnh và đếm chúng. OpenCV cung cấp một phương thức để tìm các đường cong trong ảnh gọi là contours – đường viền. Một đường viền là đường cong các điểm không bao gồm khoảng trống. Các đường viền vô cùng hữu ích trong việc xác định hình dáng vật thể và phân tích ảnh.

Để có thể tìm đường các đường viền trong ảnh, bạn đọc cần nắm được các kỹ thuật xử lý ảnh cơ bản như tách cạnh hoặc áp dụng ngưỡng. Chúng ta sẽ bắt đầu ngay vào bài toán.

Trong 11 dòng đầu tiên, chúng ta thực hiện các thao tác quen thuộc: khai báo thư viện, định nghĩa tham số đầu vào và đọc ảnh.

Như đã trình bày trong bài học trước, để có thể tách cạnh, trước hết, ta chuyển đổi ảnh từ hệ màu RGB thành ảnh xám – dòng 13, sau đó áp dụng kỹ thuật làm mờ Gaussian để lọc nhiễu – dòng 14. Trong ví dụ này, ta sử dụng bộ lọc lớn hơn là 15×15. Tiếp đó, ta tách được cạnh bằng cách áp dụng Canny ở dòng 17.

Sau khi thu được các cạnh của đồng xu, ta thực hiện tìm đường viền qua hàm cv2.findContours – dòng 20. Hàm này trả về 2 giá trị ở phiên bản OpenCV 2.4.x gồm có các đường viền và thứ tự các đường viền trong khi ở phiên bản OpenCV 3.0, hàm này trả về 3 giá trị gồm có ảnh sau khi áp dụng phát hiện đường viền, đường viền và thứ tự của chúng. Quay lại với hàm cv2.findContours, tham số đầu tiên là ảnh được tách cạnh, tiếp đó là loại đường viền mà ta muốn thu về: cv2.RETR_EXTERNAL – thu về đường viền ngoài cùng. Ngoài ra, bạn đọc có thể thử nghiệm thêm một số cài đặt khác như cv2.RETR_COMP và cv2.RETR_TREE. Tham số cuối cùng là ước tính đường viền, trong đó cv2.CHAIN_APPROX_SIMPLE nén các phân đoạn ngang, dọc, chéo vào các điểm cuối. Điều này làm quá trình tính toán nhanh hơn và giảm khối lượng bộ nhớ phải sử dụng. Nếu muốn thu về toàn bộ các điểm tạo nên đường viền mà không nén, bạn đọc sử dụng cv2.CHAIN_APPROX_NONE để so sánh với cấu hình trên. 

Như vậy, đường viền thu được nằm trong biến số cnts ở dạng list. Bạn đọc có thể đếm số đường viền thu được bằng hàm len() – 22. Sau khi thực thi đoạn mã, mình thu được kết quả đếm được 8 đồng xu xuất hiện trong ảnh.

Chúng ta thực hiện vẽ đường viền qua hàm cv2.drawContours. Tham số đầu tiên là bức ảnh ta muốn vẽ – dòng 25, tiếp đó là danh sách đường viền. Tham số thứ 3 là thứ tự đường viền, với giá trị là -1, ta thực hiện vẽ toàn bộ các đường viền có trong danh sách. Tuy nhiên, bạn đọc có thể thay đổi là giá trị này theo thứ tự đường viền bạn muốn vẽ thay vì tất cả. Cuối cùng là hai tham số về màu sắc sử dụng và độ dày của viền vẽ.

Vậy làm thế nào để chúng ta có thể trích xuất từng đồng xu trong bức ảnh kia?

Bằng cách xử lý từng phần tử trong danh sách đường viền thu được, chúng ta có thể trả lời câu hỏi trên. Dòng 28 bắt đầu vòng lặp vào danh sách đường viền. Hàm cv2.boundingRect để cắt tọa độ đồng xu xuất hiện trong ảnh và trả về tọa độ x,y bắt đầu đa giác, tiếp đó là chiều rộng và chiều cao đường viền. Các thao tác vẽ hình còn lại bạn đọc có thể tham khảo trong những bài hướng dẫn đầu tiên. Cuối cùng, chúng ta hiển thị được lần lượt các đồng xu xuất hiện trong hình

Như vậy, sau phần đầu tiên của “Thị giác máy tính toàn tập”, bạn đọc đã tìm hiểu rất nhiều phương pháp xử lý ảnh cơ bản như phép dịch, phép xoay, thay đổi kích thước hay cắt ảnh bằng cách lập trình trực tiếp với Python và OpenCV. Bên cạnh đó, chúng ta cũng cùng nhau đi qua các khái niệm và ứng dụng đồ thị phân bố điểm ảnh cũng như các phương pháp xét ngưỡng hay làm mờ ảnh. Cuối cùng, bạn đọc đã có thể áp dụng tất cả các kiến thức đó trong việc tìm xác định và tìm số đồng xu xuất hiện trong ảnh. Ở những khóa học tiếp theo, chúng ta sẽ tìm hiểu thêm về ứng dụng học sâu trong thị giác máy tính cùng một số dự án thú vị. Nếu bạn đọc muốn đi sâu hơn vào mảng này, chúng ta sẽ gặp lại nhau trong phần toán học thị giác máy tính.