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.

Phương pháp làm mờ, làm mịn ảnh số

Công nghệ

Bạn đọc hẳn không xa lạ gì với ảnh mờ – hiện tượng máy ảnh lấy hình mất nét. Trong thực tế, điều này có nghĩa là mỗi điểm ảnh trong bức ảnh bị trộn lẫn với các giá trị ảnh xung quanh nó, tạo nên một hỗn hợp các điểm ảnh – ảnh mờ mà ta quan sát được. Mặc dù đây là hiện tượng không hề mong muốn xuất hiện trong nhiếp ảnh, kỹ thuật làm mờ ảnh lại vô cùng hữu ích trong việc thực hiện các tác vụ xử lý ảnh. Việc làm mờ, làm mịn ảnh hỗ trợ rất nhiều bài toán phát hiện cạnh hay đánh giá ngưỡng giá trị. Để có thể tìm hiểu kỹ hơn về các kỹ thuật làm mờ ảnh, ta sẽ bắt đầu với ví dụ sau

Trước khi đi vào kỹ thuật làm mờ ảnh, chúng ta cần khai báo thư viện, định nghĩa tham số đầu vào qua dòng 1-9. Sau đó, ta đọc và hiển thị bức ảnh cần làm mờ ở dòng 11-13. Sau khi bức ảnh hiện lên, chúng ta bắt đầu tìm hiểu các kỹ thuật làm mờ ảnh

1.Kỹ thuật tính trung bình (averaging)
Kỹ thuật đầu tiên chúng ta tìm hiểu là kỹ thuật lấy trung bình. Như tên gọi của nó, ban đầu bạn đọc sẽ định nghĩa một cửa sổ trượt kích thước kxk, trong đó k luôn là một số lẻ. Cửa sổ này trượt từ trái qua phải và từ trên xuống dưới. Điểm ảnh ở trung tâm cửa sổ này được cài đặt là giá trị trung bình tất cả các điểm ảnh bao quanh nó. Cửa sổ trượt này được gọi là “convolution kernel” hay ngắn gọn là “kernel”. Như chúng ta có thể thấy, kích thước cửa sổ càng tăng thì ảnh càng trở nên mờ

 

Để có thể làm mờ bức ảnh, ta sử dụng hàm cv2.blur. Hàm này nhận vào hai tham số: bức ảnh chúng ta muốn làm mờ và kích thước cửa sổ trượt. Ở dòng 16-18, chúng ta làm mờ ảnh với kích thước kernel tăng dần. Bạn đọc có thể quan sát kết quả trên, với cửa sổ trượt có kích thước lớn, ảnh trở nên mờ hơn. Bên cạnh đó, để biểu diễn 3 ảnh cạnh nhau, ta sử dụng np.hstack thay vì cv2.imshow từng ảnh.
2.Kỹ thuật Gaussian
Kỹ thuật làm mờ ảnh thứ hai mà chúng ta tìm hiểu là kỹ thuật làm mờ Gaussian. Kỹ thuật này có nhiều điểm tương đồng với kỹ thuật thứ nhất, tuy nhiên, thay vì sử dụng tính trung bình đơn giản, phương pháp này sử dụng tính trung bình có đánh trọng số, trong đó, điểm ảnh gần trung tâm thì có trọng số lớn hơn phần còn lại. Kết quả cuối cùng ảnh bị mờ ít hơn phương pháp trung bình, và mờ tự nhiên hơn.

Đoạn mã làm mờ Gaussian có cú pháp gần tương tự phương pháp lấy trung bình

Dòng 23-25, chúng ta thực hiện làm mờ ảnh qua hàm cv2.GaussianBlur. Tham số truyền vào đầu tiên là ảnh ta muốn làm mờ, tham số thứ 2 là kích thước cửa sổ trượt. Ở tham số cuối cùng là giá trị độ lệch chuẩn theo trục hoành. Tuy nhiên bằng cài đặt giá trị cuối là 0, ta cho opencv biết rằng phần này sẽ được tính toán tự động dựa theo kích thước cửa sổ trượt.
3.Kỹ thuật trung vị – median
Kỹ thuật median vô cùng hiệu quả trong xử lý ảnh chụp bị sạn. Tương tự như kỹ thuật tính trung bình, ta thay đổi bằng tính trung vị với giá trị trung tâm cửa sổ trượt. Tính trung vị hiệu quả hơn trong xử lý ảnh sạn, nhiễu do mỗi điểm ảnh trung tâm luôn được thay thế bằng cường độ điểm ảnh tồn tại trong ảnh. Do đó, tạo ra phân bố đều các điểm ảnh khiến ảnh trở nên mịn hơn. Nếu như hai kỹ thuật đầu tiên tính ra giá trị trung bình có thể không nằm trong các giá trị điểm ảnh liền kề, thì khi tính trung vị, ta sẽ thu được kết quả tồn tại trong các điểm ảnh lân cận. Chúng ta có thể thực hiện kỹ thuật làm mờ trung vị như sau:

 

So với tính trung bình, cách tính trung vị sẽ thực hiện như sau:

 


Cho mảng {1,3,4,6,7} do 4 nằm giữa nên trung vị là 4. Với mảng chẵn phần tử {2,4,5,6,7,8} có 5,6 đứng giữa nên trung vị là (5+6)/2 = 5.5
Dòng 30-32 gọi hàm cv2.medianBlur, trong đó hàm này nhận hai tham số gồm ảnh cần làm mờ và kích thước cửa sổ trượt. Kết quả thu được như sau:

Ở phương pháp này, bạn đọc dễ dàng nhận thấy điểm khác biệt lớn với hai phương pháp trước đó. Với kích thước cửa sổ trượt càng tăng, kỹ thuật trung vị không còn bị mờ do chuyển động, mà nhiễu bị loại bỏ, các đường sắc nét viền giáp trở nên mịn hơn.
4.Kỹ thuật làm mờ song phương – bilateral


Kỹ thuật cuối cùng mà chúng ta tìm hiểu trong bài này là bilateral – kỹ thuật làm mờ song phương. Mục đích chính của các kỹ thuật làm mờ chính là giảm nhiễu cho ảnh, tuy nhiên quá trình làm mờ này sẽ gây ra hiện tượng mất góc cạnh trên ảnh. Phương pháp làm mờ song phương nhờ áp dụng hai hàm Gauss nên vừa có thể giảm nhiễu mà vẫn giữ được các đường nét của ảnh. Ở hàm Gauss thứ nhất chỉ bao gồm các điểm ảnh xuất hiện gần nhau theo tọa độ (x,y) trong anh. Hàm Gauss thứ hai sau đó mô hình hóa phân bố điểm ảnh lân cận, đảm bảo rằng chỉ có những điểm ảnh tương tự mới được đưa vào tính toán làm mờ. Nhìn chung, phương pháp này đảm bảo đường nét của ảnh đồng thời giảm nhiễu. Tuy nhiên, nhược điểm của nó là chậm hơn đáng kể so với ba phương pháp trên. Bạn đọc có thể hình dung phương pháp này chúng ta gặp thường xuyên trong các ứng dụng làm đẹp: xóa mụn, làm mịn da.

Chúng ta sử dụng phương pháp bilateral bằng cách gọi hàm cv2.bilateralFilter ở dòng 37-39. Tham số đầu tiên là bức ảnh chúng ta muốn làm mờ. Tiếp đó, ta cần xác định đường kính vùng điểm ảnh lân cận. Hai tham số còn lại là giá trị màu và không gian xác định ảnh hưởng của các điểm ảnh so với trung tâm. Kết quả thu được là bức ảnh giảm nhiễu nhưng vẫn giữ được các đường nét và không có hiện tượng mờ do chuyển động.

 

 

 

 

 

Diễn tập thực chiến An toàn thông tin ngành hàng không – Ứng cứu sự cố mã độc

VSEC - BLOG Sự kiện

Ngày 25 -26/12/2023 vừa qua, Trung tâm thông báo tin tức hàng không trực thuộc Tổng công ty Quản lý bay Việt Nam, phối hợp cùng Công ty Cổ phần An ninh mạng Việt Nam (VSEC) đã tổ chức thành công chương trình Diễn tập thực chiến ứng cứu sự cố mã độc năm 2023 với sự tham gia của 40 cán bộ chuyên trách an toàn thông tin, CNTT đến từ các đơn vị của Tổng công ty Quản lý bay Việt Nam (QLBVN)

Chương trình Diễn tập thực chiến diễn ra thành công với sự tham gia của 40 cán bộ chuyên trách ATTT, CNTT

Đây là cuộc diễn tập thực chiến nhằm nâng cao năng lực phối hợp, triển khai ứng phó các đợt xâm nhập với đa dạng chiến lược và kỹ thuật tấn công của các đơn vị thông qua diễn tập tình huống, năng lực tấn công và xử lý sự cố, đảm bảo tuân thủ đúng các quy định hiện hành của Nhà nước và Tổng Công ty QLBVN theo quyết định số 5211/QĐ-QLB về Quy trình ứng phó sự cố an toàn thông tin đã được ban hành ngày 23/11/2020. Đối tượng diễn tập là hệ thống AIS.

Hoạt động diễn tập thực chiến lần này đã đặt hệ thống thông tin, cán bộ chịu trách nhiệm bảo đảm ATTT dưới trạng thái sẵn sàng ứng phó các đợt xâm nhập với đa dạng chiến lược và kỹ thuật tấn công. Tại buổi diễn tập, các thành viên tham dự được chia thành 4 đội và được chuyên gia của Công ty Cổ phần An ninh mạng Việt Nam hướng dẫn cách thức tham gia diễn tập. Tình huống được đưa ra là hệ thống AIS của TTTBTTHK bị nhiễm mã độc. Các đội ứng phó sự cố sẽ thực hiện điều tra và xử lý sự cố theo đúng quy trình.

Ông Hồ Sỹ Tùng – Phó TGĐ Tổng công ty Quản lý bay Việt Nam phát biểu chỉ đạo

Phát biểu chỉ đạo tại chương trình, ông Hồ Sỹ Tùng – Phó TGĐ Tổng công ty Quản lý bay Việt Nam đã nhấn mạnh sự cấp thiết của vấn đề đảm bảo An toàn thông tin, nâng cao nhận thức của CBNV về ATTT.. Ông cho biết: “ATTT hàng không liên quan cả đến an toàn không lưu, an toàn bầu trời, và ảnh hưởng trực tiếp tới tính mạng của hành khách trên tàu bay. Chính vì thế, việc tổ chức khai thác và đảm bảo ATTT cho các hệ thống thiết bị bảo đảm hoạt động bay và ATTT trong lĩnh vực quản lý bay đang được Tổng công ty rất quan tâm, đặc biệt là nguồn nhân lực chuyên trách ATTT”. 

Ông Trần Thanh Long – Tổng giám đốc Công ty Cổ phần An ninh mạng Việt Nam

Ông Trần Thanh Long – Tổng giám đốc Công ty Cổ phần An ninh mạng Việt Nam hi vọng, thông qua cuộc diễn tập thực chiến lần này, các cán bộ chuyên trách ATTT của Trung tâm thông báo tin tức hàng không cũng như các đơn vị trực thuộc Tổng Công ty Quản lý bay Việt Nam sẽ nắm bắt các tình huống sát với thực tế, giúp cải thiện, tăng khả năng phản ứng nhanh, xử lý kịp thời khi có tấn công xảy ra.

Kết thúc diễn tập, Ban tổ chức đã trao giải Nhất, Nhì, Ba và Khuyến khích cùng các phần quà lưu niệm cho các đội tham gia thi.

Theo ông Nguyễn Văn Toàn – Trưởng phòng bảo đảm kỹ thuật Trung tâm thông báo tin tức hàng không đánh giá: “Thông qua diễn tập thực chiến, các cán bộ quản trị, cán bộ giám sát, ứng cứu sự cố an toàn thông tin đã có cơ hội nhìn nhận, học hỏi, áp dụng các kiến thức, kỹ năng vào thực tiễn “chiến trường” ATTT mạng. Từ đó đưa ra các định hướng về việc hoàn thiện kỹ năng, chuẩn hóa quy trình, cải tiến công nghệ nhằm đáp ứng khả năng ứng cứu, xử lý những thách thức ngày càng gia tăng.

Ông Nguyễn Văn Toàn – Trưởng phòng bảo đảm kỹ thuật Trung tâm thông báo tin tức hàng không chia sẻ

CSTV Capture The Flag 2023 (CTF) – Cuộc thi uy tín nhất để tìm kiếm các Pentester tương lai

Sự kiện

(CTF) Nằm trong khuôn khổ TECHFEST 2023, Làng Công nghệ An toàn an ninh mạng do Công ty Cổ phần An ninh mạng Việt Nam là trưởng làng, đã phối hợp cùng các đơn vị tổ chức cuộc thi “CSTV Capture the Flag 2023” – Tìm kiếm Penetration-tester tương lai dành cho Sinh viên ATTT tại Việt Nam. Cuộc thi CTF này không chỉ là sân chơi kiến thức cho các bạn sinh viên, mà còn là nơi để kết nối những bạn có đam mê An toàn thông tin tới các đơn vị uy tín trong ngành, giúp các bạn có cơ hội được học tập, làm việc và phát triển bản thân hơn.

 

Cuộc Thi CTF Là Gì?

Capture The Flag (gọi tắt là CTF)là một dạng cuộc thi kiến thức chuyên sâu về Bảo mật thông tin được tổ chức theo mô hình thi đấu theo cá nhân hoặc theo đội, thử thách người chơi tìm ra lời giải cho một vấn đề nào đó trong An ninh mạng.  Trong không gian ảo, các đội tham gia sẽ đối mặt với nhiệm vụ thách thức nhằm kiểm tra và cải thiện khả năng bảo mật thông tin. CTF có thể chơi dưới hình thức thi đấu tìm ra Flag (hay mật mã) giấu bên trong server, hoặc phía sau một trang web. Mỗi Flag tương ứng với số điểm, đội nào tìm ra Flag nhanh hơn, đạt nhiều điểm hơn sẽ giành chiến thắng vòng thi. Trong cuộc thi CTF thường cập nhật các thông tin về lỗ hổng bảo mật, các kỹ thuật mới trong hacking và security. Do đó, qua mỗi lần thi CTF người chơi học hỏi, cập nhật kiến thức security và hacking, giao lưu, chia sẻ qua các bài write-up (các bài giải) với mọi người, rèn luyện khả năng tư duy, giải quyết vấn đề.

 

CSTV Capture The Flag 2023 mang lại gì cho người tham gia ?

CTF hấp dẫn và thu hút giới hacker, người làm bảo mật bởi lẽ các cuộc thi này phản ánh rất chân thật công việc hàng ngày và đòi hỏi người chơi phải có các kỹ năng của một hacker, người làm về bảo mật thực thụ. Muốn chiến thắng ở một cuộc thi CTF, người chơi không chỉ phải nhuần nhuyễn các kỹ năng phát hiện và khai thác lỗ hổng bảo mật, mà còn phải thật sự lành nghề trong việc bảo vệ sự an toàn và duy trì tính liên tục của hệ thống mạng trước các đợt tấn công dồn dập từ bên ngoài.

Có thể nói qua một số lợi ích, tác dụng khi tham gia các cuộc thi CTF đối với những người tham gia như:

  • Được học hỏi các kiến thức cần thiết, cập nhật về security và hacking.
  • Đưa những kiến thức chúng ta được học lý thuyết (ở trường, sách vở, báo chí, hội thảo…) ra với thực tế để hiểu đúng bản chất của vấn đề như: (hiểu cách thức reverse engineering một phần mềm, tại sao các phần mềm có thể bị crack; tại sao có thể xâm nhập vào một máy tính; các kỹ thuật khai thác ứng dụng web; Mật mã – mã hóa được áp dụng như thế nào trong thực tế; forensic – điều tra phần tích truy dấu vết được thực hiện như thế nào…)
  • Các bài CTF đòi hỏi người chơi cần có rất nhiều kiến thức sâu về không chỉ security mà còn kỹ năng lập trình, mạng,…nên đây là cơ hội giúp chúng ta củng cố, nâng cao các kỹ năng đang có và bổ sung các kỹ năng mới.
  • Các cuộc thi CTF thường cập nhật các thông tin về lỗ hổng bảo mật, các kỹ thuật mới trong hacking và security. Tham gia làm các bài thi là cách giúp chúng ta nắm được các vấn đề đó một cách cụ thể, đúng bản chất…
  • Qua mỗi lần thi CTF người chơi có thể biết được các kiến thức mình đang còn thiếu, cần bổ sung học hỏi thêm…
  • Giao lưu, chia sẻ qua các bài write-up (các bài giải) với mọi người đồng thời tham khảo các write-up của các người chơi khác để học hỏi…
  • Rèn luyện tính sáng tạo, tăng cường khả năng tư duy, giải quyết vấn đề

 

Vậy, làm thế nào để tham dự CSTV Capture The Flag 2023?

Cuộc thi CSTV CTF của Làng Công Nghệ An toàn an ninh mạng tổ chức hướng đến đối tượng chính là các bạn sinh viên đam mê và đang theo đuổi ngành Công Nghệ Thông Tin và An Ninh Thông Tin hiện đang theo học tại các trường đại học, cao đẳng trên toàn quốc. Đây là cơ hội để họ không chỉ học hỏi từ những chuyên gia hàng đầu trong ngành mà còn thể hiện tài năng của mình trong môi trường cạnh tranh lành mạnh và hỗ trợ.

  • Thời gian: 08h00 – 17h30, thứ bảy ngày 06/01/2024
  • Phạm vi: Toàn quốc (Online)
  • Hình thức: Thi CTF theo đội (mỗi đội từ 3-5 thành viên)
  • Chi tiết về cuộc thi: Truy cập trang sự kiện chính thức tại ĐÂY
  • Cách thức đăng ký: Vui lòng đăng ký tại Link
  • Agenda chương trình:
    Start End Duration Description Note
    8:30:00 AM 9:00:00 AM 0:30:00 Khai mạc
    Giới thiệu hội đồng BGK
    Công thể thể lệ
    Công bố giải thưởng
    Zoom
    9:00:00 AM 9:30:00 AM 0:30:00 Ổn định kết nối
    Hỗ trợ giải đáp thắc mắc (nếu có)
    9:30:00 AM 4:30:00 PM 7:00:00 Thi CTFd
    4:30:00 PM 5:00:00 PM 0:30:00 Kết thúc cuộc thi
    BGK tổng hợp kết quả
    5:00:00 PM 5:15:00 PM 0:15:00 Công bố kết quả chung cuộc
    Giải đáp thắc mắc
    5:15:00 PM 5:30:00 PM 0:15:00 Đại diện trưởng làng chúc mừng đội thi và cảm ơn các thí sinh đã tham gia
    Total 9:00 x x

Giải thưởng của CSTV CTF hấp dẫn như thế nào?

Khi đăng ký tham gia cuộc thi, các bạn sẽ nhận được quà tặng từ Ban tổ chức.

Cơ cấu giải thưởng của cuộc thi, bao gồm

  • 01 giải Nhất: trị giá 10 triệu đồng, và giấy chứng nhận
  • 01 giải Nhì: trị giá 5 triệu đồng, và giấy chứng nhận
  • 02 giải Ba: trị giá 2 triệu đồng, và giấy chứng nhận

Ngoài ra, các bạn còn có cơ hội được thực tập và làm việc chính thức tại các đơn vị như VSEC, Nessar,… Hãy nhanh tay “gom” đồng đội để cùng chinh phục “CSTV Capture the Flag 2023 – Gõ cửa An ninh mạng” ngay thôi nào!!!

VSEC chính thức trở thành đối tác chiến lược của SPLUNK

VSEC - BLOG Nổi bật Thông cáo - Tin tức

Một hành trình đáng tự hào của VSEC khi được SPLUNK – đơn vị nằm trong TOP 3 Vendor cung cấp giải pháp SIEM trên thế giới – công bố là một trong những đối tác chiến lược của mình. VSEC không chỉ là đối tác bán hàng (Sell Motion) mà còn là 1 trong 5 đối tác cung cấp dịch vụ (Manage Motion) của Splunk tại Việt Nam.

Đây không chỉ là một bước tiến quan trọng trong sự phát triển của Công ty Cổ phần An ninh mạng Việt Nam mà còn là một cơ hội mới để VSEC nâng cao khả năng phân tích dữ liệu và giám sát an toàn thông tin của mình. Sự kết hợp giữa VSEC và SPLUNK hứa hẹn mang lại những giải pháp tối ưu và hiệu quả cho khách hàng và cộng đồng. 

Tuy nhiên, không có thành công nào là trải sẵn hoa hồng, “đỉnh núi” SPLUNK này cũng vậy, không hề dễ dàng chinh phục. SPLUNK đã đưa ra rất nhiều tiêu chí cực kỳ khắt khe như: phải hoàn thành các khóa học của SPLUNK dưới sự giám sát chặt chẽ bằng công nghệ cao của họ. Không chỉ vậy, việc học này sẽ phải  được duy trì trong các năm tiếp theo. Bên cạnh đó, để có thể gia nhập vào mạng lưới partner của SPLUNK, các đơn vị cũng cần phải đạt được các chứng chỉ bắt buộc mà SPLUNK yêu cầu. Các chứng chỉ này đều rất khó, đòi hỏi những kỹ sư phải có trình độ chuyên môn cao thì mới học và thi được các chứng chỉ này. 

Trải qua 2 tháng liên tục vừa học vừa thi và hoàn tất các thủ tục để đăng ký, cuối cùng VSEC đã chính thức góp mặt trong mạng lưới partner của SPLUNK. Trao đổi với anh Lê Đức Hợp – Giám đốc Kinh doanh khu vực phía Bắc của VSEC, anh cho biết về sự kỳ vọng của SPLUNK đối với VSEC là rất lớn. Đội ngũ cần có sự chuyên môn hóa hơn với từng bộ phận. Các chuyên viên phát triển thị trường cần có có insight về thị trường, có tập khách hàng lớn, nhất là các khách hàng có độ trưởng thành cao về ATTT; có khả năng tư vấn, thuyết phục khách hàng ứng dụng các giải pháp  của SPLUNK nhằm giúp khách hàng giải quyết được các bài toán phức tạp. Riêng đối với đội ngũ kỹ thuật sẽ phải thành thạo các giải pháp công nghệ của Splunk để cung cấp dịch vụ chất lượng cao tới khách hàng. “Sản phẩm và giải pháp của SPLUNK là sản phẩm giải pháp phức tạp, hướng tới khách hàng có độ trưởng thành cao về Công nghệ thông tin và An Toàn thông tin, vì vậy họ cần những đối tác có khả năng tư vấn, gợi mở yêu cầu và thuyết phục được khách hàng” – anh Hợp cho biết thêm.

Ngay trong tuần đầu tiên của tháng 11, SPLUNK đã sang thăm và có buổi làm việc với VSEC. Hai bên đã cùng trao đổi về các dự án hiện đang trong giai đoạn tư vấn / POC giải pháp của SPLUNK cùng dịch vụ giám sát của VSEC tới khách hàng. Đây là bước đầu trong mục tiêu trở thành Elite Tier Partner – đối tác cấp cao nhất của SPLUNK trong tương lai gần. Với kinh nghiệm hoạt động 20 năm trong lĩnh vực ATTT, sở hữu SOC đạt tiêu chuẩn CREST, VSEC hoàn toàn thấu hiểu insight của khách hàng tại thị trường Việt Nam. Đây chính là “điểm sáng” chứng minh cho các đối tác nước ngoài  rằng VSEC hoàn toàn có thể làm chủ các công nghệ khó trên thế giới. Mặc dù hành trình trở thành đối tác của SPLUNK còn gặp rất nhiều trở ngại bởi sự khác biệt về ngôn ngữ, vấn đề pháp lý và phong cách làm việc… nhưng đây chính là cột mốc quan trọng  nữa trong hành trình phát triển của VSEC 2023, hướng tới mục tiêu mang lại giá trị thực sự thông qua những dịch vụ đẳng cấp quốc tế cho khách hàng vào năm 2024.

SecuStories #1 : Hacker và lịch sử hình thành

VSEC - BLOG Bảo mật cho người mới

Khi nghe thấy thuật ngữ “hacker” – tin tặc, nhiều người sẽ nghĩ ngay đến hình ảnh những kẻ tội phạm mạng, đột nhập vào các hệ thống máy tính để đánh cắp dữ liệu hoặc gây thiệt hại. Tuy nhiên, bạn có thể ngạc nhiên khi biết rằng thế giới sẽ tồi tệ hơn nhiều nếu không có hacker.

Hack là gì ?

Chúng ta hãy mở đầu câu trả lời cho câu hỏi này bằng cách làm rõ rằng không phải hacker nào cũng là tội phạm.

Khi được sử dụng liên quan đến máy tính, công chúng thường liên tưởng việc hack với việc truy cập trái phép vào hệ thống máy tính, tài khoản cá nhân và mạng máy tính hoặc lạm dụng các thiết bị kỹ thuật số – chủ yếu là để thu lợi tài chính hoặc gây thiệt hại. Với sự đưa tin của các phương tiện truyền thông, người ta có thể dễ dàng nghĩ rằng tin tặc luôn hành động thiếu thiện chí.

Điều gì tạo nên một hacker? “Hack” là quá trình sử dụng kỹ năng và kiến thức kỹ thuật để giải quyết một vấn đề hoặc thách thức cụ thể. Điều này có thể được thực hiện với hoặc không có sự tham gia của máy tính. 

Nhiều người cũng nghĩ rằng “hacker” ám chỉ một cá nhân có tư duy siêu việt hoặc một kẻ lừa đảo thượng hạng. Hacker thực sự thường có kỹ năng phần cứng hoặc phần mềm máy tính để có thể sử dụng chúng ngoài mục đích ban đầu của nhà phát triển. Khi Hacker đột nhập vào mạng hoặc hệ thống máy tính, đó được gọi là security hacking. Mặc dù thông thường, hacker thường được truyền thông đặt cho cái tên là “tội phạm mạng” chuyên đánh cắp dữ liệu và gây ra các loại thiệt hại kỹ thuật số khác, nhưng thuật ngữ chính xác cho loại hình hack bất hợp pháp (illegal hacking) đó là bẻ khoá (cracking).

Lịch sử Hacking

Vụ hack đầu tiên gần giống với định nghĩa hiện đại của chúng ta là vào năm 1903. Năm 1903, kỹ sư điện và nhà phát minh người Ý Guglielmo Marconi, đã chuẩn bị trình diễn hệ thống truyền dẫn không dây mới được phát minh gần đây của mình ở Anh. 

Marconi đã tuyên bố rằng đường truyền không dây của anh ấy là “an toàn và riêng tư”. Nhưng một nhà phát minh và pháp sư đối thủ tên là Nevil Maskelyne (1863-1924) đã chứng minh anh ta sai. Khi Marconi chuẩn bị bắt đầu cuộc trình diễn của mình, một cuộc truyền tải khắp nước Anh thông qua mã morse, Maskelyne là người đã xâm nhập vào tín hiệu bằng mã morse của chính mình mà thiết bị Marconi nhận được. Tin nhắn của anh ấy có một vài từ chọn lọc nhắm vào Marconi. Việc truyền tin lừa đảo này đã bị nhà vật lý học John A. Fleming, người sẽ nhận được tin nhắn của Marconi, chê bai là “chủ nghĩa côn đồ khoa học”. Nhưng đã quá muộn – Maskelyne đã công khai vạch trần một lỗ hổng nghiêm trọng trong công nghệ của Marconi (mà Marconi đã biết) và Marconi rõ ràng không hài lòng về điều đó.

120 năm sau, khi nhìn lại sự kiện trên, thật vui khi có thể nói rằng “Chúng ta đã đi được một chặng đường dài kể từ đó”.

Hacking trở thành một loại hình chính thức

Các thành viên của Tech Model Railroad Club – Câu lạc bộ Đường sắt Mô hình Công nghệ tại MIT (Viện Công nghệ Massachusetts) là những người đầu tiên sử dụng thuật ngữ “hack” trong bối cảnh công nghệ. Sau Thế chiến thứ hai, những sinh viên này bắt đầu sử dụng từ “hack” để biểu thị một giải pháp sáng tạo (và đôi khi không chính thống) cho một vấn đề kỹ thuật. Đây có thể coi là định nghĩa “chính thức” đầu tiên của thuật ngữ này vẫn được áp dụng cho đến ngày nay.

Chuyển sang đầu những năm 1960, khi máy tính bắt đầu trở nên dễ tiếp cận hơn với các cơ sở học thuật. Đó là vào thời của chương trình Apollo của NASA, nơi Phòng thí nghiệm thiết bị tại MIT được giao nhiệm vụ phát triển phần cứng và phần mềm máy tính để đưa con người lên mặt trăng, trước sự ngạc nhiên và thất vọng của các công ty lâu đời như IBM. Trên thực tế, hợp đồng phát triển hệ thống máy tính cho Apollo là một trong những hợp đồng đầu tiên được trao trong toàn bộ chương trình. Các thành viên câu lạc bộ tò mò khi bước vào lĩnh vực công nghệ mới này đã mang theo thuật ngữ này. Kể từ đó, “hack” đã gắn liền rất chặt chẽ với điện toán.

Nhưng phải đến đầu những năm 1980, hack như một hiện tượng được công nhận rộng rãi mới bắt đầu phát triển. Lần đầu tiên, máy tính có sẵn và giá cả phải chăng cho công chúng. Hầu như ai cũng có thể mua một chiếc máy tính và thử nghiệm hack từ thời điểm đó trở đi. Và họ chắc chắn đã làm thử nghiệm. Việc hack có nhiều hình thức khác nhau – từ thuần thú vị đến thử thách trí óc, đến gây khó chịu nhẹ cho đến tội phạm thẳng thắn. Đây cũng là thời kỳ Chiến tranh Lạnh, vì vậy gián điệp máy tính tất nhiên là một chủ đề được đưa lên hàng đầu các tiêu đề.

Nhiều hacker nguy hiểm nhất thế giới trong những năm gần đây lấy cảm hứng từ những người tiên phong đầu tiên này.

Đến năm 1986, “criminal hacking” – tội phạm mạng đã trở nên phổ biến ở Mỹ đến mức Đạo luật Lừa đảo và Lạm dụng Máy tính (CFAA) đã được thông qua. Đây là luật đầu tiên trên thế giới chống lại tội phạm mạng.

Các loại Hacker

Hack chủ yếu là về khả năng sáng tạo vô biên, sự đổi mới không sợ hãi và sự can đảm để đi chệch khỏi lối suy nghĩ tiêu chuẩn. Câu lạc bộ máy tính Chaos, hiệp hội hacker lớn nhất ở châu Âu, định nghĩa hack là “việc sử dụng công nghệ một cách sáng tạo, thiết thực và thiếu tôn trọng”. Thật không may, không phải tất cả các hacker đều chấp nhận việc hack vì mục đích hack.

Dựa trên tính hợp pháp của các hoạt động của họ, tin tặc có thể được chia thành ba nhóm lớn.

Hacker mũ đen

Hacker mũ đen xuất hiện thường xuyên nhất trên các phương tiện truyền thông: tội phạm mạng đeo mặt nạ khéo léo đột nhập vào hệ thống máy tính để đánh cắp hoặc sửa đổi dữ liệu hoặc thực hiện các hành vi bất hợp pháp khác. 

Khi một hacker mũ đen phát hiện ra điểm yếu trong phần mềm, anh ta hoặc cô ta sẽ khai thác lỗ hổng đó cho mục đích phạm tội. Hacker có thể viết một chương trình/phần mềm khai thác. Đó là một phần mềm khai thác điểm yếu để xâm nhập vào hệ thống máy tính và phát tán phần mềm độc hại. Tin tặc cũng có thể rao bán khám phá này trên web đen. Đôi khi hacker mũ đen thậm chí còn cố gắng ép buộc (hoặc hối lộ) người khác làm việc cho họ. Đây được gọi là mối đe dọa nội bộ. Vào tháng 8 năm 2020, một hacker đã đề nghị cho nhân viên Tesla 1 triệu USD để bí mật cài đặt ransomware tại siêu nhà máy của công ty ở bang Nevada của Hoa Kỳ. May mắn thay, nhân viên này đã báo cáo việc này với FBI và hacker đã bị bắt.

 

Hacker mũ trắng và hacker đạo đức

Không giống như hacker mũ đen, hacker mũ trắng tiến hành hoạt động một cách công khai. Hacker mũ trắng là đối trọng của hacker mũ đen

Các công ty thường thuê hacker mũ trắng cố tình tấn công hệ thống và phần mềm của họ nhằm phát hiện ra các lỗ hổng hoặc vấn đề bảo mật. Đây được gọi là thử nghiệm thâm nhập – Penetration Testing. Điều này cho phép các công ty tăng cường bảo mật trước khi hacker mũ đen có thể xâm nhập. Do đó, người ta nói rằng tin tặc mũ trắng tham gia vào hoạt động hack có đạo đức. Một số tin tặc mũ trắng làm việc nội bộ tại các tổ chức lớn, trong khi những tin tặc khác hoạt động như những người làm việc tự do hoặc lao động tự do. Hơn nữa, tin tặc có đạo đức cũng có thể khiến nhân viên bị lừa đảo để kiểm tra mức độ phục hồi của tổ chức trước các cuộc tấn công thực sự và để xác định các khu vực cần đào tạo bổ sung về an ninh mạng.

Họ cũng báo cáo các lỗ hổng trong một ứng dụng nhất định cho nhà cung cấp hoặc nhà phát triển ứng dụng bị ảnh hưởng, đôi khi là “pro bono”, đôi khi để nhận tiền thưởng lỗi được trả cho bất kỳ nhà nghiên cứu nào phát hiện ra lỗ hổng nghiêm trọng.

 

Hacker mũ xám

Với sự pha trộn giữa đen và trắng, các hacker mũ xám với cách thức hoạt động tự do hơn, họ không phải là những người có lòng vị tha nhưng cũng không chuyên tham gia vào các hoạt động tội phạm.

Hacker mũ xám thường hack trước rồi mới xin phép. Mặt khác, các hacker có đạo đức sẽ yêu cầu phê duyệt trước. Nhiều hacker mũ xám trước tiên sẽ quét hệ thống hoặc phần mềm của công ty để tìm kiếm các vấn đề bảo mật. Chỉ khi họ đã tìm thấy thì họ mới đưa ra giải pháp. Tất nhiên là có tính phí. Các hacker mũ xám khác sử dụng hack như một phương tiện hoạt động. Họ công khai các lỗ hổng, để công ty được đề cập bị áp lực của dư luận buộc phải khắc phục vấn đề. Sau khi một hacker mũ xám phát hiện ra vấn đề bảo mật tại Facebook vào năm 2013 và sau đó bị công ty này liên tục từ chối, anh ta đã quyết định tấn công Mark Zuckerberg bằng cách lợi dụng thông tin rò rỉ để đăng thông báo lên dòng thời gian của CEO.

Mặc dù hoạt động của hacker mũ xám có thể mang lại kết quả tích cực nhưng việc hack mà không được phép vẫn là bất hợp pháp. Trong một số trường hợp, tin tặc đã công khai tiết lộ một lỗ hổng và sau đó đã được sửa, nhưng sau đó lại bị tổ chức liên quan khởi kiện (hoặc bị chính quyền quấy rối theo lệnh của họ). Cách tiếp cận “bắn người đưa tin” này được nhiều người coi là một động thái không khôn ngoan, bởi vì một khi một tổ chức nổi tiếng vì thực hiện hành động pháp lý chống lại các nhà nghiên cứu tiết lộ điểm yếu, họ sẽ không nhận được thêm thông báo nào như vậy trong tương lai – hoặc ít hơn rất nhiều. Những tin tức như vậy lan truyền rất nhanh trong cộng đồng bảo mật và không thể giữ bí mật được. Thay vào đó, các nhà nghiên cứu có thể tự mình nhờ đến chính quyền để vạch trần sự sơ suất và vi phạm quyền riêng tư – hoặc họ “ngồi xuống và thưởng thức”.

Hacker hoạt động thế nào ?

Hầu hết việc hack là một vấn đề kỹ thuật nhưng tin tặc cũng có thể sử dụng kỹ thuật xã hội để lừa người dùng nhấp vào tệp đính kèm độc hại hoặc cung cấp dữ liệu cá nhân. Bên cạnh kỹ thuật xã hội và quảng cáo độc hại, các kỹ thuật hack phổ biến bao gồm: botnet, DDoS, ransomware và phần mềm độc hại khác.

Nếu bạn muốn có cái nhìn tổng quan về kho công cụ của hacker thì không có cái nào toàn diện cả. Nhưng có một số công cụ – thương mại cũng như nguồn mở – được tin tặc ở cả hai đầu sử dụng, chẳng hạn như nmap, mimikatz, Ghidra, burp, Cain&Abel, Purple Knight hoặc Metasploit. Mỗi công cụ có một công dụng riêng và tin tặc thường tập hợp các bộ công cụ của riêng mình.

Từ Script Kiddies đến tội phạm có tổ chức

Thật không may, hack đã phát triển từ trò nghịch ngợm của tuổi teen thành một doanh nghiệp tăng trưởng hàng tỷ đô la, những người ủng hộ nó đã thiết lập một cơ cấu trọng tội phát triển và bán các công cụ hack chìa khóa trao tay cho những kẻ lừa đảo có kỹ năng chuyên môn thấp hơn (được gọi là “script-kiddies”). 

Bạn có thể nói rằng tin tặc cố gắng đột nhập vào máy tính và mạng vì bất kỳ lý do nào trong năm lý do sau. 

  • Có những lợi ích tài chính điển hình như trộm cắp số liệu thẻ tín dụng hoặc lừa đảo hệ thống ngân hàng. 
  • Phá hoại hoặc tấn công danh tiếng của mọi người hoặc công ty là động cơ thúc đẩy một số tin tặc khi họ để lại dấu ấn trên các trang web. Điều này còn được gọi là “Defacement”.
  • Ngoài ra còn có hoạt động gián điệp công nghiệp, trong đó tin tặc của một công ty tìm cách đánh cắp thông tin về sản phẩm và dịch vụ của đối thủ để đạt được lợi thế kinh doanh. 
  • Và tất nhiên, toàn bộ các quốc gia tham gia vào hoạt động hack do nhà nước bảo trợ để đánh cắp thông tin kinh doanh và/hoặc thông tin công cộng, nhằm gây mất ổn định cơ sở hạ tầng hoặc thực sự là tạo ra sự bất hòa và nhầm lẫn trong xã hội của quốc gia mục tiêu của họ. 
  • Và cũng có hacker có động cơ chính trị hoặc xã hội. Họ thường cố gắng thúc đẩy một mục đích nào đó nhưng lại thiếu động lực tài chính. Những nhà hoạt động hacker hay còn gọi là “hacktivists” này cố gắng hướng sự chú ý của công chúng đến một vấn đề bằng cách chiếu ánh sáng không mấy tích cực vào mục tiêu – nói chung là bằng cách công khai thông tin nhạy cảm. Các nhóm hacktivist nổi tiếng nhất, cùng với một số hoạt động nổi tiếng hơn của họ là  Anonymous ,  WikiLeaks và  LulzSec . Vấn đề với những loại tin tặc này là họ sử dụng các kỹ năng hack của mình với một số kiểu tinh tế ‘Robin Hood’ và điều đó khiến nhiều người bối rối khi nghĩ rằng hành động của họ luôn hợp pháp. 

Nhiều người giải quyết một vấn đề chính đáng bằng những cách đôi khi đáng nghi ngờ. Những tin tặc này dường như làm cho toàn bộ ngành công nghiệp hack có vẻ ngầu hoặc quyến rũ vì những lý do sai lầm. Đó là một điều nguy hiểm vì nó có thể khiến những người có tiềm năng tốt nhưng thiếu kinh nghiệm vượt qua một ranh giới rất mỏng manh.

Hack có vi phạm pháp luật không?

Hack không sai, cái sai ở đây là không được sự đồng thuận của chủ sở hữu.

Hacker mũ trắng có toàn quyền, cơ bản là các quyền đó đều đã được khách hàng cấp phép. Tuy nhiên đối với Hacker mũ xám, nếu công khai phát hiện của mình, họ có thể phải chịu hậu quả pháp lý, mặc dù họ có thể có ý định tốt.

Tất nhiên, mọi hoạt động của hacker mũ đen đều là bất hợp pháp. Nếu bạn trở thành nạn nhân của hacker mũ đen, bạn có thể và nên báo cáo tội phạm mạng này cho các cơ quan hữu quan ở quốc gia hoặc khu vực của bạn. Điều này có thể giúp giảm thiểu thiệt hại gây ra, đưa hacker ra trước công lý và hy vọng ngăn chặn được những nạn nhân tiếp theo trong tương lai.

Khuôn khổ nào cho Hacker?

Theo cơ quan an ninh mạng của nước này ‘The Centre for Cyber Security Belgium – Trung tâm An ninh Mạng Bỉ’, Bỉ đã trở thành quốc gia (châu Âu) đầu tiên áp dụng khuôn khổ bến cảng an toàn toàn diện và quốc gia dành cho các tin tặc có đạo đức. Cơ quan này, còn được gọi là CCB, đã công bố chính sách bảo vệ các cá nhân hoặc tổ chức khỏi bị truy tố – tùy thuộc vào việc đáp ứng một số điều kiện “nghiêm ngặt” nhất định – khi họ báo cáo các lỗ hổng bảo mật ảnh hưởng đến bất kỳ hệ thống, ứng dụng hoặc mạng nào ở Bỉ.

Theo quy trình được tạo trong chính sách tiết lộ lỗ hổng bảo mật phối hợp quốc gia (CVDP), CCB – nhóm ứng phó khẩn cấp máy tính (CSIRT) của Bỉ – hiện có thể nhận được báo cáo về lỗ hổng CNTT cung cấp cho các nhà nghiên cứu bảo mật một số biện pháp bảo vệ pháp lý trong trường hợp đáp ứng các điều kiện sau:

  • Họ phải thông báo cho chủ sở hữu công nghệ dễ bị tấn công (ví dụ: Trang web, gói phần mềm, v.v.) càng sớm càng tốt và cùng lúc với CCB
  • Hành xử không có ý định gian lận hoặc có ý định làm hại
  • Hành động nghiêm ngặt theo cách tương xứng để chứng minh sự tồn tại của lỗ hổng
  • Họ cần gửi báo cáo lỗ hổng cho CCB càng sớm càng tốt theo định dạng cụ thể
  • Thông tin về lỗ hổng và hệ thống dễ bị tấn công có thể không được tiết lộ ra công chúng nếu không có sự đồng ý của CCB

Nhưng chúng ta phải cẩn thận và vẫn còn rất nhiều câu hỏi cần trả lời… 

Và tôi nghĩ có một số sắc thái mà chúng ta cần xem xét. Liệu một hacker có đạo đức có thể thực hiện thử nghiệm thâm nhập toàn diện vào một công ty mà không hề hay biết không? Một hacker đạo đức có thể phát hành 0-days mới trên tất cả các địa chỉ IP của Bỉ không? Thật tốt khi luật pháp đã có và bảo vệ những hacker có đạo đức, nhưng đó vẫn không phải là tấm thẻ ra tù. Một hacker có đạo đức tìm thấy SQL Insert và sau đó xóa toàn bộ cơ sở dữ liệu để chứng minh rằng anh ta đã tìm thấy lỗi vẫn có thể bị trừng phạt.

Nói tóm lại, từ ngày hình thành đến nay, Hacker đã phát triển và liên tục biến đổi. Nó đã đặt nền móng cho ngành an ninh mạng phát triển đến quy mô hiện nay và vẫn tiếp tục mở rộng. Cùng với đó, nhân loại cũng đang tìm cách xây dựng, đưa ra các khuôn khổ để hạn chế rủi ro cho chính mình và cho cả những hacker có đạo đức.

Vẽ hình với OpenCV

Công nghệ

Ở bài trước, bạn đọc hẳn đã nắm được cách tương tác cơ bản với ảnh, đơn giản hơn là tương tác các phần tử trong mảng, ma trận. Nhắc lại một chút, ta có ma trận a = [2, 1, 4, 5] có phần tử: a[0] = 2, a[1] = 1, a[2] = 4, a[3] = 5 do chỉ số phần tử bắt đầu từ 0. Ngoài ra, ta có thể chọn nhiều phần tử a[0:3] = [2,1,4], hay tạo hình chữ nhật, hình vuông như ở bài viết trước. Tuy nhiên, làm thế nào để ta có thể vẽ đường thẳng, hoặc đường tròn khi mà thư viện Numpy không hỗ trợ chúng ta? Dễ dàng thay, OpenCV đã hộ trợ thuận tiện cho người dùng qua các hàm vẽ hình khối. Trong bài viết này, bạn đọc cùng tôi sẽ tìm hiểu ba phương thức vẽ hình đơn giản lần lượt là: cv2.line (vẽ đường thẳng), cv2.rectangle (vẽ đa giác), và cv2.circle (vẽ đường tròn)

1.Vẽ đường thẳng và đa giác

Để có thể bắt đầu vẽ đường thẳng, hay đa giác sử dụng OpenCV thì trước hết chúng ta cần định nghĩa khung giới hạn. Bạn đọc có thể tưởng tượng như quá trình chúng ta vẽ một bức tranh thì trước đó ta cần chuẩn bị giấy mực và khung cố định. Ở đây, bút và mực là các hàm hỗ trợ trong OpenCV còn khung tranh là cửa sổ ta định nghĩa khi khởi tạo. Ở các bài học trước, chúng ta đã đọc ảnh trực tiếp từ tệp có sẵn, tuy nhiên, ta cũng có thể tạo một bức ảnh cho riêng mình bằng việc xuất phát từ định nghĩa khung bằng cách sử dụng định nghĩa mảng trong Numpy. Bạn đọc tham khảo mã nguồn sau:

Bạn đọc hẳn đã quen với ngôn ngữ lập trình Python, ở dòng 1-2 ta thực hiện khai báo thư viện sử dụng gồm numpy và opencv, trong đó numpy có thể sử dụng qua cách viết tắt là np. Dòng 4 thực hiện khởi tạo khung tranh có kích thước là 300 dòng và 300 cột cùng 3 kênh màu RGB. Bên cạnh đó, np.zeros khởi tạo một mảng có giá trị ban đầu là 0. Như vậy, chúng ta đã tạo ra một bức ảnh có độ phân giải 300×300 được tạo thành từ các số 0.

Nhắc lại một chút, ở dòng 5 mình chọn thay đổi giá trị bức ảnh ở diện tích 100×100 đầu tiên từ giá trị 0 thành 255, thu được kết quả như sau:

Ta có thể thấy rằng, hình vuông 100×100 nằm trong khung 300×300 có màu trắng có giá trị là 255 và phần còn lại trong khung có giá trị là 0. Bên cạnh đó, bạn đọc nên chú ý phương thức khởi tạo ma tận np.zeros: gồm có kiểu dữ liệu viết là dtype. Khi chúng ta xử lý ảnh với ảnh là RGB và giá trị điểm ảnh trong khoảng [0, 255], kiểu dữ liệu được khai báo là uint8 – ta dùng 8-bit số nguyên để biểu diễn. Ngoài ra còn có rất nhiều kiểu dữ liệu khác có thể tùy chọn sử dụng (32-bit nguyên, 32-bit hoặc 64-bit số thực), nhưng trong các ví dụ sắp tới, chúng ta sẽ chủ yếu sử dụng uint8.

Sau khi khởi tạo khung thành công, chúng ta bắt đầu những hình vẽ đầu tiên với xuất phát từ việc tạo ra một đường thẳng:

Ở dòng 5 và dòng 9, ta định nghĩa 2 màu là xanh và đỏ để tạo màu cho đường thẳng ta định vẽ. Tiếp đó, ta vẽ đường màu xanh với điểm bắt đầu có tọa độ là (0,0) và điểm kết thúc có tọa độ là (300,300). Ta nhận thấy rằng hàm cv2.line nhận vào các tham số: khung, tạo độ điểm bắt đầu, tọa độ điểm kết thúcmàu sắc và độ dày của đường thẳng. Kết quả thu được:

Như vậy, bạn đọc đã nắm được cách vẽ đường thẳng vô cùng đơn giản cùng OpenCV. Chúng ta sẽ tiếp tục với vẽ đa giác qua hàm cv2.rectangle

Để có thể vẽ đa giác, ở dòng 15, phương thức cv2.rectangle nhận vào các tham số lần lượt là: khung, tọa độ bắt đầu, tọa độ kết thúc, màu sắc sử dụng và cuối cùng là độ dày viền. Tọa độ bắt đầu của đa giác là (10,10), kết thúc là (60,60) ta thu được đa giác có 50×50 điểm ảnh. Ngoài ra, với độ dày là -1, hàm cv2.rectangle sẽ tạo đa giác với toàn bộ diện tích theo màu được định nghĩa

Mã nguồn đầy đủ cho phần vẽ đường thẳng và đa giác:

2.Vẽ đường tròn

Chúng ta sẽ bắt đầu vẽ đường tròn bằng cách khởi tạo khung nền đen mới như sau:

Ở dòng 29, ta định nghĩa cX, xY đại diện cho tọa độ (x,y) trung tâm của khung ảnh. Bạn đọc tìm được tâm của bức ảnh đơn giản qua việc chia đôi chiều dài và chiều rộng của khung khởi tạo, ta sẽ có tọa độ trung tâm, trong đó khung.shape[1] là chiều ngang và khung.shape[0] là chiều dọc. Tiếp đó, ta định nghĩa màu trắng để lên màu cho đường tròn định vẽ. Ở dòng 32, bạn đọc thấy vòng lặp từ 0 tới 175 với bước nhảy 25 mỗi vòng. Hàm cv2.circle dòng 36 nhận vào các tham số: khung, tọa độ tâm đường tròn, bán kính và màu sắc. Bán kính tăng lên qua mỗi vòng lặp, ta thu được kết quả:

Với ba giá trị: bán kính, tọa độ và màu sắc, hẳn bạn đọc đã có thể tự vẽ cho bản thân một hay nhiều đường tròn. Sau đây, chúng ta sẽ cùng nhau thử sáng tạo nghệ thuật bằng cách tạo ra ngẫu nhiên các đường tròn

Ở dòng 38, chúng ta lặp 10 lần, có nghĩa là ta sẽ vẽ 10 đường tròn ngẫu nhiên có giá trị nguyên ngẫu nhiên sinh bởi hàm np.random.randint. Trong đó, bán kính ngẫu nhiên nằm ở khoảng giá trị [5,200] – dòng 39. Màu sắc ngẫu nhiên – dòng 37, như chúng ta đã biết thì một điểm ảnh RGB bao gồm 3 giá trị trong khoản [0,255]. Và để sinh 3 giá trị ngẫu nhiên, từ khóa size=(3,) sẽ hướng dẫn Numpy trả về 3 giá trị nguyên ngẫu nhiên. Cuối cùng là tọa độ ngẫu nhiên của đường tròn trong khoảng [0,300]. Bên cạnh đó, giá trị -1 trong hàm vẽ cv2.circle tô toàn bộ diện tích đường tròn với màu chỉ định. Tác phẩm nghệ thuật mà chúng ta thu được:

Như vậy, sau bạn đọc đã nắm được một số thao tác cơ bản để có thể tự tương tác với một bức ảnh, hay tạo ra chúng. Ở bài học tiếp, chúng ta sẽ cùng nhau đi tìm hiểu các phép xử lý ảnh cùng những ứng dụng thú vị mà các phép toán này đem lại.