Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Trong hướng dẫn này, bạn sẽ tìm hiểu cách tìm một cấu hình hoặc mẫu nhất định trong hình ảnh nhị phân bằng cách sử dụng biến đổi Hit-or-Miss (còn được gọi là biến đổi Hit-and-Miss). Sự biến đổi này cũng là cơ sở của các hoạt động hình thái tiên tiến hơn như tỉa thưa hoặc cắt tỉa.
Toán tử hình thái xử lý hình ảnh dựa trên hình dạng của chúng. Các toán tử này áp dụng một hoặc nhiều thành phần cấu trúc cho một hình ảnh đầu vào để có được hình ảnh đầu ra. Hai hoạt động hình thái cơ bản là xói mòn và giãn nở. Sự kết hợp của hai hoạt động này tạo ra các biến đổi hình thái tiên tiến như mở, đóng hoặc biến đổi mũ đỉnh.
Phép biến đổi Hit-or-Miss rất hữu ích để tìm các mẫu trong ảnh nhị phân. Cụ thể, nó tìm thấy các pixel có vùng lân cận khớp với hình dạng của phần tử cấu trúc thứ nhất B1 trong khi không khớp với hình dạng của phần tử cấu trúc thứ hai B2 cùng một lúc. B1 và B2 là các phàn tử cấu trúc biệt lập, bị chặn. Về mặt toán học, thao tác được áp dụng cho hình ảnh A có thể được biểu thị như sau:
Các phần tử cấu trúc B1 và B2 có thể được kết hợp thành một phần tử B. Hãy xem một ví dụ:
Trong trường hợp này, chúng tôi đang tìm kiếm một mẫu trong đó pixel trung tâm thuộc về background(0) trong khi các pixel phía bắc, nam, đông và tây thuộc về foreground(255). Phần còn lại của pixel trong vùng lân cận có thể là bất kỳ loại nào, chúng tôi không quan tâm đến chúng. Bây giờ, hãy áp dụng kernel này cho một hình ảnh đầu vào:
Code ví dụ bằng python:
import cv2 as cv
import numpy as np
input_image = np.array((
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 255, 255, 255, 0, 0, 0, 255],
[0, 255, 255, 255, 0, 0, 0, 0],
[0, 255, 255, 255, 0, 255, 0, 0],
[0, 0, 255, 0, 0, 0, 0, 0],
[0, 0, 255, 0, 0, 255, 255, 0],
[0,255, 0, 255, 0, 0, 255, 0],
[0, 255, 255, 255, 0, 0, 0, 0]), dtype="uint8")
kernel = np.array((
[0, 1, 0],
[1, -1, 1],
[0, 1, 0]), dtype="int")
output_image = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel)
rate = 50
kernel = (kernel + 1) * 127
kernel = np.uint8(kernel)
kernel = cv.resize(kernel, None, fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
cv.imshow("kernel", kernel)
cv.moveWindow("kernel", 0, 0)
input_image = cv.resize(input_image, None, fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
cv.imshow("Original", input_image)
cv.moveWindow("Original", 0, 200)
output_image = cv.resize(output_image, None , fx = rate, fy = rate, interpolation = cv.INTER_NEAREST)
cv.imshow("Hit or Miss", output_image)
cv.moveWindow("Hit or Miss", 500, 200)
cv.waitKey(0)
cv.destroyAllWindows()