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.