Thị giác máy tính với OpenCV-Python Bài 4, Phần 4: Làm mịn hình ảnh

Thị giác máy tính với OpenCV-Python Bài 4, Phần 4: Làm mịn hình ảnh

Thị giác máy tính với OpenCV-Python Bài 4, Phần 4: Làm mịn hình ảnh

10:35 - 30/12/2021

Trong phần này chúng ta sẽ tìm hiểu cách làm mờ hình ảnh với nhiều bộ lọc thông thấp khác nhau và áp dụng các bộ lọc tùy chỉnh cho hình ảnh.

Thị giác máy tính với OpenCV-Python Bài 7 Phần 3: Nhận diện khuôn mặt
Thị giác máy tính với OpenCV-Python Bài 7 Phần 2: Phát hiện người đi bộ trong video
Thị giác máy tính với OpenCV-Python Bài 7 Phần 1: Phát hiện người đi bộ trong hình ảnh
Thị giác máy tính với OpenCV-Python Bài 6 Phần 2: Phép trừ nền
Thị giác máy tính với OpenCV-Python Bài 6 Phần 1: Bắt bám đối tượng với Meanshift và Camshift

Biến đổi 2D (Lọc hình ảnh)

Giống như tín hiệu một chiều, hình ảnh cũng có thể được lọc bằng nhiều bộ lọc thông thấp (LPF), bộ lọc thông cao (HPF), v.v. LPF giúp loại bỏ nhiễu, làm mờ hình ảnh, v.v. Bộ lọc HPF giúp tìm kiếm các cạnh trong hình ảnh.

OpenCV cung cấp hàm thực hiện chức năng lọc là cv2.filter2D(). Lấy ví dụ, chúng ta sẽ thử một bộ lọc trung bình trên một hình ảnh. Thao tác như sau: để ma trận bộ lọc trung bình 5x5 trên một pixel, thêm tất cả 25 pixel bên dưới ma trận, lấy giá trị trung bình của nó và thay thế pixel trung tâm bằng giá trị trung bình mới. Tiếp tục thao tác này cho tất cả các pixel trong hình ảnh. Hãy thử đoạn code dưới đây và kiểm tra kết quả:

  1. import cv2
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. img = cv2.imread('opencv.jpg')
  5. kernel = np.ones((5, 5), np.float32)/25
  6. dst = cv2.filter2D(img, -1, kernel)
  7. plt.subplot(121), plt.imshow(img), plt.title('Original')
  8. plt.xticks([ ]), plt.yticks([ ])
  9. plt.subplot(122), plt.imshow(dst), plt.title('Averaging')
  10. plt.xticks([ ]), plt.yticks([ ])
  11. plt.show()

Kết quả:

 

Làm mờ hình ảnh (Làm mịn hình ảnh)

Làm mờ hình ảnh đạt được bằng cách biến đổi hình ảnh với một bộ lọc thông thấp để loại bỏ nhiễu. Thao tác này thực sự loại bỏ nội dung tần số cao (ví dụ: nhiễu, các cạnh) khỏi hình ảnh. Vì vậy, các cạnh được làm mờ một chút trong thao tác này. OpenCV chủ yếu cung cấp bốn loại kỹ thuật làm mờ.

1. Tính trung bình

Thực hiện bằng cách biến đổi hình ảnh với bộ lọc hộp chuẩn hóa, tức là lấy giá trị trung bình của tất cả các pixel trong vùng ma trận và thay thế phần tử trung tâm thông qua các hàm cv2.blur() hoặc cv2.boxFilter().  Đoạn code dưới đây minh họa phép làm mờ trung bình với ma trận nhân có kích thước 5x5:

  1. import cv2
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. img = cv2.imread('opencv.jpg')
  5. blur = cv2.blur(img,(5, 5))
  6. plt.subplot(121), plt.imshow(img), plt.title('Original')
  7. plt.xticks([ ]), plt.yticks([ ])
  8. plt.subplot(122), plt.imshow(blur), plt.title('Blurred')
  9. plt.xticks([ ]), plt.yticks([ ])
  10. plt.show()

Kết quả:

 

2. Làm mờ Gaussian

Thay vì bộ lọc hộp, nhân gaussian được sử dụng thông qua hàm cv2.GaussianBlur(). Cần chỉ định chiều rộng và chiều cao của ma trận nhân là số dương lẻ, chỉ định độ lệch chuẩn theo hướng X và Y, tương ứng là sigmaX và sigmaY. Nếu chỉ sigmaX được chỉ định, sigmaY được coi như sigmaX. Nếu cả hai được cho dưới dạng số 0, chúng được tính từ kích thước ma trận nhân. Tính năng làm mờ Gaussian có hiệu quả cao trong việc loại bỏ nhiễu gaussian khỏi hình ảnh. Đoạn code trên có thể được sửa đổi để làm mờ Gaussian:

  1. blur = cv2.GaussianBlur(img, (5, 5), 0)

Kết quả:

 3. Làm mờ trung vị

Ở đây, hàm cv2.medianBlur() lấy giá trị trung bình của tất cả các pixel trong vùng và phần tử trung tâm được thay thế bằng giá trị trung bình này. Điều này có hiệu quả cao trong việc chống nhiễu hạt tiêu trong ảnh. Trong các bộ lọc trên, phần tử trung tâm là giá trị mới được tính toán, có thể là giá trị pixel trong ảnh hoặc giá trị mới. Nhưng trong tính năng làm mờ trung vị, yếu tố trung tâm luôn được thay thế bằng một số giá trị pixel trong hình ảnh. Nó làm giảm nhiễu một cách hiệu quả. Kích thước ma trận nhân của nó phải là một số nguyên dương lẻ. Để thực hiện, thay thế hàm sau vào đoạn code ở Mục 1:

  1. median = cv2.medianBlur(img, 5)

Kết quả:

 

4. Lọc song phương

cv2.bilateralFilter() có hiệu quả cao trong việc loại bỏ nhiễu trong khi vẫn giữ các cạnh sắc nét. Nhưng hoạt động chậm hơn so với các bộ lọc khác. Chúng ta đã thấy rằng bộ lọc gaussian lấy một vùng lân cận xung quanh pixel và tìm mức trung bình có trọng số gaussian của nó. Bộ lọc gaussian không xem xét liệu các pixel có cường độ gần như giống nhau hay không, không xem xét liệu pixel có phải là pixel cạnh hay không. Vì vậy, nó cũng làm mờ các cạnh, điều đôi khi không mong muốn.

Bộ lọc song phương cũng sử dụng bộ lọc gaussian trong không gian nhưng thêm chức năng sự khác biệt pixel. Hàm Gaussian không gian đảm bảo chỉ các pixel lân cận được xem xét làm mờ trong khi hàm gaussian về sự chênh lệch cường độ đảm bảo chỉ những pixel có cường độ tương tự với pixel trung tâm mới được xem xét làm mờ. Vì vậy, nó bảo toàn các cạnh vì các pixel ở các cạnh sẽ có sự thay đổi cường độ lớn. Để thực hiện, thay thế hàm sau vào đoạn code ở Mục 1:

  1. blur = cv2.bilateralFilter(img, 9, 75, 75)

Kết quả:

 

Có thể thấy nhiễu bề mặt đã biến mất, nhưng các góc cạnh vẫn được giữ nguyên.

Ở phần tiếp theo chúng ta sẽ cùng tìm hiểu về cách tìm các cạnh của hình ảnh.

 

(Sưu tầm)
VIỆN IMC
Tòa nhà IMC Tower, Số 176 Trường Chinh, Phường Khương
Thượng, Quận Đống Đa, Thành phố Hà Nội, Việt Nam
Tel/Fax : (+84) 24 3566 6232 / 24 3566 6234
Email: contact@imc.org.vn   Website: https://imc.org.vn