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.