Xử lý ảnh : Erosion, Dilation, Opening, Closing

Lí thuyết

Hôm nay mình xin giới thiệu về một số phương pháp xử ảnh nhị phân sẽ được dùng trong quá trình preprocessing hoặc postprocessing. Tuỳ theo dữ liệu mà chúng ta sẽ áp dụng những phương pháp xử lý cho phù hợp với những bộ lọc phù hợp nó sẽ giúp cho hình ảnh sau khi xử lý loại bỏ bớt nhiễu, cân bằng sáng.. gây ảnh hưởng tới chất lượng của ảnh. Bài hôm nay mình xin giới thiệu 4 phương pháp:

  1. Erosion
  2. Dilation
  3. Opening
  4. Closing

Trước khi đi vào tìm hiểu chúng ta sẽ cùng nhìn qua các hình ảnh dưới đây để hình dung qua về quá trình xử lý của các phương pháp trên.

a-original image
b-dilation
c-erosion
e-opening
f-closing

Ta có công thức xác định erosion và dialation như sau :

Với :


Với s là ma trận pixel của ảnh, f là filter có thể là 1 mảng hoặc một ma trận nhị phân tuỳ theo từng loại dữ liệu mà ta sẽ chọn kích thước fiter cho phù hợp.

Erosion

Erosion hay còn gọi là xói mòn là một trong hai toán tử cơ bản trong lĩnh vực hình thái toán học ( mathematical morphology). Nó thường được áp dụng trong những hình ảnh nhị phân tuy nhiên có một số phiên bản sẽ được áp dụng trên những hình ảnh xám tuy nhiên trong phạm vi bài viết của mình hôm nay thì chỉ tập trung vào những hình ảnh nhị phân.
Mục đích của phương pháp này sẽ giúp:

  1. Loại bỏ những pixel nhiễu cô lập
  2. Loại bỏ những pixel nhiễu xung quanh đối tượng giúp cho phần viền (cạnh) của đối tượng trở nên mịn hơn
  3. Loại bỏ lớp viền (cạnh) của đối tượng giúp đối tượng trở nên nhỏ hơn và đặt những pixel viền đó trở thành lớp nền của đối tượng
    Ta có ví dụ sau đây :

Dilation

Dilation hay còn còn là sự giãn nở là toán tử còn lại mà đã nêu ở trên, nó ngược lại với erosion cũng được áp dụng trong các ảnh nhị phân. Mục đích của phương pháp này sẽ giúp:

  1. Với những hình ảnh bị đứt nét có thể giúp nối liền ảnh lại
  2. Với những pixel nhiễu xung quanh đối tượng sẽ trở thành viền của đối tượng
  3. Giúp nổi bật đối tượng trong ảnh hơn
    Ta có ví dụ sau đây:

Opening

Open = Erode next Dilate
Với :

Closing

Close = Dilate next Erode Với

Ta có hình ảnh trực quan sau :

Tuỳ theo từng loại dữ liệu và yêu cầu của bài toán thì sẽ áp dụng các phương pháp linh hoạt.

Thực hành

Code thôi nào, phần mình hứng thú nhất đây rồi 😃

Erosion

import cv2
from IPython.display import Image
image = cv2.read(path, cv2.IMREAD_GRAYSCALE)  #doc hinh anh

#ta có thể áp dụng các bộ lọc  sepFilter2D(), filter2D(), blur(), boxFilter(), bilateralFilter(), medianBlur()
#dưới đây mình xin áp dụng bộ lọc trung vi 3x3

img = cv2.medianBlur(image, 3) 
cv2.imwrite(path, img) #lưu ảnh vào đường dẫn
Image(path)  #hiển thị ảnh

Dilation

import cv2
from IPython.display import Image
image = cv2.read(path, cv2.IMREAD_GRAYSCALE)  #doc hinh anh

img = cv2.convertScaleAbs(image, 1.1, 5)
cv2.imwrite(path, img)
Image(path)

Tài liệu tham khảo:

Bài viết trên được mình tổng hợp khi mình tham gia học lớp của thầy Đinh Viết Sang - giảng viên trường Đại học Bách Khoa Hà Nội và một số tài liệu mình tham khảo dưới đây:

  • Thư viện opencv
  • Computer Vision: Algorithms and Applications, 2010 by Richard Szelisk


Cảm ơn các bạn đã theo dõi bài viết của mình 😃