Xử lý ảnh : Erosion, Dilation, Opening, Closing
This post hasn't been updated for 4 years
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:
- Erosion
- Dilation
- Opening
- 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à
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:
- Loại bỏ những pixel nhiễu cô lập
- 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
- 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:
- Với những hình ảnh bị đứt nét có thể giúp nối liền ảnh lại
- Với những pixel nhiễu xung quanh đối tượng sẽ trở thành viền của đối tượng
- 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
All Rights Reserved