Lọc nhiễu trong xử lý ảnh python

Môi trường "hành sự"

  • Linux (bài viết sử dụng Ubuntu 16.04)
  • OpenCV (bài viết sử dụng OpenCV 3.4.1)
  • Python (bài viết sử dụng Python 3.5.5)
  • Ảnh mẫu để xử lý: girl_luv.jpg

Bạn có thể download ảnh mẫu về:

girl_luv.jpg (Nguồn: bí mật không thể bật mí :v)

Lọc nhiễu trong xử lý ảnh python

Ảnh gốc rõ lắm, nhưng mình cố tình tạo thử thách bằng cách thêm nhiễu để có cái để làm cho mấy bộ làm mờ chứ :P

Lọc nhiễu trong xử lý ảnh python

Hiệu ứng làm mờ ảnh

Khi nhắc đến việc làm mờ hình ảnh, bạn sẽ nghĩ ngay đến việc tại mình phải làm điều đó? Ảnh đang rõ vậy làm mờ chi cho khó nhìn ta?!

Thực ra trong xử lý ảnh, phép làm mờ ảnh được dùng rất nhiều và có nhiều vai trò quan trọng. Hiệu ứng làm mờ mang lại (áp dụng trong các trường hợp):

  • Giảm nhiễu (noise) trong ảnh
  • Làm trơn ảnh (smooth). Việc làm trơn ảnh sẽ giảm sắc nét của cạnh, thay vào đó, vùng trơn sẽ lan ra

Trong các bài báo về xử lý ảnh, ở bước tiền xử lý họ hay dùng 2 phép biến đổi sau:

  • Cân bằng sáng
  • Làm mờ

Kích thước cửa sổ của các bộ lọc làm thường là SỐ LẺ NGUYÊN DƯƠNG (3, 5, 7, 9, …). Chính vì kích thước lẻ nên ta sẽ chỉ có 1 pixel ở trung tâm kernel, điều này tránh việc ta phải phân vân nên lấy pixel trái hay phải làm pixel trung tâm NẾU kích thước bộ lọc là số chẵn!

Việc chọn kích thước bộ lọc thường dựa vào kích thước ảnh đầu vào và kinh nghiệm. Kernel thường được thiết kế hình vuông (tức width = height)

Tính toán xử lý cho phép biến đổi làm mờ ảnh chính là dùng toán tử convolution để áp cửa sổ / bộ lọc lên ảnh gốc.

Tiếp theo, mình sẽ giới thiệu 3 bộ làm mờ giảm nhiễu phổ biến: Box Filter, Gaussian Filter và Median Filter

Bộ lọc mờ trung bình (Box Filter)

  • Bộ lọc làm mờ trung bình được thiết kế bằng cách thiết lập mỗi giá trị trên bộ lọc bằng: 1/(W*H).
  • Tức là nếu Width và Height của bộ lọc bằng 3. Thì giá trị trên cửa sổ convolve sẽ là: 1/9.

box_blur.py

import os
import cv2

INPUT = 'girl_luv.jpg'
KERNEL_WIDTH = 3
KERNEL_HEIGHT = 3

if not os.path.isfile(INPUT):
    raise Exception('File not found @ %s' % INPUT)

img = cv2.imread(INPUT)


blur_img = cv2.blur(img, ksize=(KERNEL_WIDTH, KERNEL_HEIGHT)) # or cv2.boxFilter

cv2.imwrite('box_blur_%s_%d_%d.jpg' % (os.path.splitext(os.path.basename(INPUT))[0], KERNEL_WIDTH, KERNEL_HEIGHT), blur_img)

Lọc nhiễu trong xử lý ảnh python

Hãy thử thay đổi các hằng số trong code để trải nghiệm các mức độ làm mờ khác nhau nhé:

  • KERNEL_WIDTH
  • KERNEL_HEIGHT

Bộ lọc làm mờ Gaussian (Gaussian Filter)

  • Công thức Gaussian: https://docs.opencv.org/2.4/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html#gaussian-filter
  • Ngoài kích thước cửa sổ, bộ lọc Gaussian còn cho phép thiết lập thêm 2 tham số là: Sigma X và Sigma Y, tức độ lệch chuẩn theo trục x và trục y tương ứng.

gaussian_blur.py

import os
import cv2

INPUT = 'girl_luv.jpg'
KERNEL_WIDTH = 9
KERNEL_HEIGHT = 9
SIGMA_X = 4
SIGMA_Y = 4

if not os.path.isfile(INPUT):
    raise Exception('File not found @ %s' % INPUT)

img = cv2.imread(INPUT)


blur_img = cv2.GaussianBlur(img, ksize=(KERNEL_WIDTH, KERNEL_HEIGHT), sigmaX=SIGMA_X, sigmaY=SIGMA_Y)

cv2.imwrite('gaussian_blur_%s_%d_%d_%d_%d.jpg' % (os.path.splitext(os.path.basename(INPUT))[0], KERNEL_WIDTH, KERNEL_HEIGHT, SIGMA_X, SIGMA_Y), blur_img)

Lọc nhiễu trong xử lý ảnh python

Hãy thử thay đổi các hằng số trong code để trải nghiệm các mức độ làm mờ khác nhau nhé:

  • KERNEL_WIDTH
  • KERNEL_HEIGHT
  • SIGMA_X
  • SIGMA_Y
  • Trung vị (median) là ta lấy ra giá trị trung vị sau khi sắp thứ tự dãy số. Ví dụ: median([6, 8, 11, 4, 1]) = 6. Giải: sau khi sắp thứ tự dãy [6, 8, 11, 4, 1], ta được [1, 4, 6, 8, 11] => số ở giữa dãy đã sắp thứ tự là 6.
  • Rất hiệu quả với nhiễu muối tiêu (tức nhiễu các hạt nhỏ trong ảnh).
  • Trong OpenCV, tham số cho bộ lọc trung vị chỉ có KERNEL_SIZE (không cho đặc tả Width / Height) và phải là số lẻ.

median_blur.py

import os
import cv2

INPUT = 'girl_luv.jpg'
KERNEL_SIZE = 9

if not os.path.isfile(INPUT):
    raise Exception('File not found @ %s' % INPUT)

img = cv2.imread(INPUT)


blur_img = cv2.medianBlur(img, KERNEL_SIZE)

cv2.imwrite('median_blur_%s_%d.jpg' % (os.path.splitext(os.path.basename(INPUT))[0], KERNEL_SIZE), blur_img)

Lọc nhiễu trong xử lý ảnh python

Hãy thử thay đổi các hằng số trong code để trải nghiệm các mức độ làm mờ khác nhau nhé:

  • KERNEL_SIZE

Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!

  • Minh: https://www.facebook.com/minhng.info
  • Khám phá xử lý ảnh - GVGroup: https://www.facebook.com/groups/ip.gvgroup

Khám phá xử lý ảnh - GVGroup

Danh sách bài viết series OpenCV:

  • Hashtag #OpenCV
  • Tut 1: Xử lý ảnh - OpenCV đọc ghi hình ảnh (code Python và C++)
  • Tut 1.1: Xử lý ảnh - Cấu trúc dữ liệu ảnh trong OpenCV. Pixel là gì?
  • Tut 1.2: Xử lý ảnh - Chuyển đổi ảnh OpenCV sang Pillow và ngược lại
  • Tut 2: Xử lý ảnh - OpenCV resize, crop và padding hình ảnh (code Python và C++)
  • Tut 3: Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh (code Python)
  • Tut 4: Xử lý ảnh - OpenCV vùng quan tâm (ROI) là gì? (code Python)
  • Tut 4.1: Xử lý ảnh - OpenCV: vẽ văn bản, đường thẳng, mũi tên, hình chữ nhật, hình tròn, ellipse, đa giác
  • Tut 4.2: Xử lý ảnh - Pha trộn ảnh trong OpenCV (blending)
  • Tut 5: Xử lý ảnh - OpenCV ảnh nhị phân
  • Tut 6: Xử lý ảnh - OpenCV cân bằng sáng (histogram equalization)
  • Tut 7: Xử lý ảnh - OpenCV kỹ thuật cửa sổ trượt (sliding window)
  • Tut 8: Xử lý ảnh - Convolution là gì?
  • Tut 9: Xử lý ảnh - Làm mờ ảnh (blur)
  • Tut 10: Xử lý ảnh - Gradient của ảnh là gì?
  • Tut 11: Xử lý ảnh - Phát hiện cạnh Canny (Canny Edge Detection)
  • Tut 12: Xử lý ảnh - Phát hiện đường thẳng bằng Hough Transform (Hough Line)
  • Tut 13: Xử lý ảnh - Hiện thực phát hiện đoạn thẳng dùng Hough Transform (Hough Line)
  • Tut 14: Xử lý ảnh - Giải thuật phân vùng Region Growing trên ảnh màu
  • Tut 15: Xử lý ảnh - Giải thuật Background Subtraction trên ảnh màu
  • Tut 16: Xử lý ảnh - Frame Subtraction để phát hiện chuyển động trong video
  • Tut 17: Xử lý ảnh - HOG - Histograms of Oriented Gradients
  • Tut 18: Xử lý ảnh - HOG - Huấn luyện mô hình phân loại người
  • Tut 19: Xử lý ảnh - HOG - Phát hiện người
  • Tut 20: Xử lý ảnh - Tổng hợp kinh nghiệm xử lý ảnh (End)
  • Tut 21: Xử lý ảnh - Hiện thực trích đặc trưng Local Binary Patterns (LBP)
  • Tut 22: Xử lý ảnh - Trích đặc trưng Gabor filters