[OpenCV-Tutorials] Hit-or-Miss

1
Dỗ Hoang Việt Anh viết gần 5 năm trước

[OpenCV-Tutorials] Hit-or-Miss

Mục tiêu

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.

Lý thuyết

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:
alt text

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ụ:
alt text

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:
alt text

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()
Bình luận


White
{{ comment.user.name }}
Hay Bỏ hay
{{ comment.like_count}}
White

Dỗ Hoang Việt Anh

45 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}

  Cùng một tác giả


{{like_count}}

kipalog

{{ comment_count }}

Bình luận


White
{{userFollowed ? 'Following' : 'Follow'}}
45 bài viết.
1 người follow

 Đầu mục bài viết

 Cùng một tác giả