Đối sánh mẫu là một kỹ thuật, nhờ đó một bản vá hoặc mẫu có thể được đối sánh từ một hình ảnh thực tế. Về cơ bản đây là một cơ chế đối sánh mẫu.
Trong Python có mô-đun OpenCV. Sử dụng openCV, chúng tôi có thể dễ dàng tìm thấy kết quả phù hợp. Vì vậy, trong vấn đề này, các kỹ thuật đối sánh mẫu OpenVC được sử dụng.
Để sử dụng chức năng OpenCV, chúng tôi cần tải chúng xuống bằng cách sử dụng pip .
sudo pip3 install opencv-python
Đối với nhiệm vụ đối sánh mẫu, có một yếu tố chính xác, yếu tố này được gọi là ngưỡng. Ví dụ, chúng ta có thể nói rằng chúng ta có thể dễ dàng tạo lược đồ nhận dạng khuôn mặt bằng cách sử dụng giải pháp đối sánh mẫu này. Chúng tôi có thể cung cấp một số hình ảnh về mắt hoặc bất kỳ bộ phận nào khác của khuôn mặt, sau đó sử dụng những hình ảnh đó làm mẫu, nó có thể dễ dàng tìm thấy sự phù hợp, nhưng có những biến thể khác nhau về mắt. Vì vậy, nếu chúng tôi đặt mức độ chính xác là 50%, nó sẽ phát hiện tốt hơn mức độ chính xác 100%. Nói chung, mức độ chính xác là 80% trong các trường hợp khác nhau.
Các bước để đối sánh Mẫu
-
Chụp hình ảnh thực tế và chuyển đổi nó thành hình ảnh tỷ lệ xám.
-
Lấy mẫu làm hình ảnh tỷ lệ xám
-
Mẫu trượt qua hình ảnh thực tế và tìm vị trí phù hợp với mức độ chính xác.
-
Khi kết quả lớn hơn mức chính xác, hãy đánh dấu vị trí đó là được phát hiện.
Đối với trường hợp đầu tiên, Hình ảnh đầu vào và mẫu là -
Hình ảnh chính
Mẫu
Mã mẫu
import cv2 import numpy as np #open the main image and convert it to gray scale image main_image = cv2.imread('main_image.png') gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY) #open the template as gray scale image template = cv2.imread('template1.png', 0) width, height = template.shape[::-1] #get the width and height #match the template using cv2.matchTemplate match = cv2.matchTemplate(gray_image, template, cv2.TM_CCOEFF_NORMED) threshold = 0.8 position = np.where(match >= threshold) #get the location of template in the image for point in zip(*position[::-1]): #draw the rectangle around the matched template cv2.rectangle(main_image, point, (point[0] + width, point[1] + height), (0, 204, 153), 0) cv2.imshow('Template Found', main_image) cv2.waitKey(0)
Đầu ra
Đoạn mã trên không hỗ trợ đa tỷ lệ. Vì vậy, nếu kích thước của mẫu không giống nhau, nó sẽ không phát hiện. Vì vậy, trong phần tiếp theo, chúng ta sẽ xem cách chúng ta có thể sử dụng tính năng đa tỷ lệ để phát hiện các mẫu.
Theo cách tiếp cận này, hình ảnh thực tế được chuyển đổi thành các kích thước khác nhau, mỗi khi nó khớp với mẫu và tìm hệ số tương quan lớn nhất để xác định vị trí phù hợp.
Đây hình ảnh thực tế giống nhau, bản mẫu ở đây -
Mã mẫu
import imutils import cv2 import numpy as np #Open template and get canny template = cv2.imread('template3.jpg') template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) template = cv2.Canny(template, 10, 25) (height, width) = template.shape[:2] #open the main image and convert it to gray scale image main_image = cv2.imread('main_image.png') gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY) temp_found = None for scale in np.linspace(0.2, 1.0, 20)[::-1]: #resize the image and store the ratio resized_img = imutils.resize(gray_image, width = int(gray_image.shape[1] * scale)) ratio = gray_image.shape[1] / float(resized_img.shape[1]) if resized_img.shape[0] < height or resized_img.shape[1] < width: break #Convert to edged image for checking e = cv2.Canny(resized_img, 10, 25) match = cv2.matchTemplate(e, template, cv2.TM_CCOEFF) (_, val_max, _, loc_max) = cv2.minMaxLoc(match) if temp_found is None or val_max>temp_found[0]: temp_found = (val_max, loc_max, ratio) #Get information from temp_found to compute x,y coordinate (_, loc_max, r) = temp_found (x_start, y_start) = (int(loc_max[0]), int(loc_max[1])) (x_end, y_end) = (int((loc_max[0] + width)), int((loc_max[1] + height))) #Draw rectangle around the template cv2.rectangle(main_image, (x_start, y_start), (x_end, y_end), (153, 22, 0), 5) cv2.imshow('Template Found', main_image) cv2.waitKey(0)