Trong bài viết này, chúng tôi trình bày cách khớp một hình ảnh được nhúng trong một hình ảnh khác trong Python bằng mô-đun OpenCV
OpenCV có các chức năng có thể thực hiện các tìm kiếm được nhắm mục tiêu trong một hình ảnh lớn hơn cho một hình ảnh được nhúng trong đó, giả sử chúng tôi cung cấp cho nó hình ảnh mục tiêu để tìm kiếm
Điều này được gọi là đối sánh mẫu
OpenCV có chức năng, cv2. matchTemplate[], cho phép chúng tôi tìm kiếm một hình ảnh được nhúng trong một hình ảnh khác [lớn hơn] và chúng tôi có thể xem liệu chúng tôi có thể tìm thấy hình ảnh này không
Điều này có thể có nhiều ứng dụng hữu ích như khám phá xem một đối tượng có nằm trong một hình ảnh rất cồng kềnh hay không
Vì vậy, trong ví dụ này, giả sử, chúng ta có hình ảnh sau được hiển thị bên dưới
Bây giờ chúng tôi có một phần của hình ảnh này dưới dạng hình ảnh độc lập được hiển thị bên dưới. Chúng tôi đã loại bỏ phần này ra khỏi hình ảnh gốc. Điều này tượng trưng cho lá vàng
Vì vậy, chúng tôi đã loại bỏ phần này khỏi hình ảnh Rainforest ban đầu. Hình ảnh này chứa một chiếc lá vàng
Sử dụng OpenCV, chúng tôi xác định vị trí hình ảnh mục tiêu trong hình ảnh lớn hơn mà chúng tôi đang tìm kiếm nó và vẽ một hình chữ nhật xung quanh kết quả khớp
Điều này cho chúng ta hình ảnh sau đây được hiển thị bên dưới
Vì vậy, bây giờ chúng ta hãy chuyển sang viết mã để xem điều này được thực hiện như thế nào. Mã đầy đủ được hiển thị bên dưới
Bây giờ chúng ta hãy đi qua mã này
Chúng tôi nhập mô-đun OpenCV
Sau đó, chúng tôi tạo một biến, hình ảnh, chứa hình ảnh mà chúng tôi muốn tìm kiếm. Trong trường hợp này, đó là 'Rừng nhiệt đới. png'
Chúng tôi hiển thị hình ảnh này
Sau đó, chúng tôi tạo một phiên bản thang độ xám của hình ảnh này. Điều này đơn giản hóa hình ảnh
Sau đó, chúng tôi tạo một biến khác, mẫu, đại diện cho tập hợp con hình ảnh mà chúng tôi muốn tìm kiếm trong hình ảnh lớn hơn, hình ảnh ['Rainforest. png']. Hình ảnh này được đặt tên là 'Yellowing-leaf. png'
Sau đó, chúng tôi có một biến khác, kết quả, về cơ bản lưu trữ liệu có tìm thấy kết quả phù hợp hay không
Sau đó, chúng tôi tạo một bộ giá trị cho phép chúng tôi có được vị trí của trận đấu, giả sử có trận đấu. Biến, max_loc, đại diện cho
Tiếp theo, chúng tôi có một bộ khác, chiều cao và chiều rộng, chứa chiều cao và chiều rộng của hình ảnh mẫu hoặc hình ảnh đích mà chúng tôi đang tìm kiếm trong hình ảnh lớn hơn. Chúng tôi có những giá trị này bởi vì chúng tôi sẽ làm nổi bật hình ảnh sau khi tìm thấy
Sau đó, chúng tôi có một biến, đối diện_corner, đại diện cho phía dưới bên phải của hình chữ nhật mà chúng tôi sẽ tạo. Nếu chúng ta lấy max_loc[0] và thêm chiều rộng và max_loc[1] và thêm chiều cao, chúng ta sẽ có được góc dưới cùng bên phải
max_loc đại diện cho góc trên cùng bên trái
Sau đó chúng tôi sử dụng cv2. Chức năng hình chữ nhật [] để vẽ một hình chữ nhật xung quanh trận đấu. Chúng tôi làm điều này với màu đỏ với độ dày của dòng là 5
Chúng tôi sử dụng cv2. hàm matchShapes[] để khớp hai hình dạng hình ảnh. Hàm này trả về một số liệu cho thấy sự giống nhau giữa các hình dạng hình ảnh. Hàm này sử dụng Hu-Moments để tính giá trị số liệu. Giá trị số liệu thấp hơn, độ tương tự giữa các hình ảnh cao hơn
Trong các ví dụ sau, chúng tôi sẽ khớp các hình dạng từ các hình ảnh khác nhau và cả các hình dạng từ một hình ảnh duy nhất
cú pháp
Chúng tôi sử dụng cú pháp sau để khớp hai hình dạng hình ảnh -
ret = cv2.matchShapes[cnt1,cnt1,1,0.0]
Ở đâu,
cnt1 - Các điểm đường viền của hình dạng hình ảnh đầu tiên
cnt2 - Các điểm đường viền của hình ảnh thứ hai
bước
Bạn có thể sử dụng các bước sau để khớp hai hình ảnh –
Nhập thư viện cần thiết. Trong tất cả các ví dụ Python sau, thư viện Python bắt buộc là OpenCV. Hãy chắc chắn rằng bạn đã cài đặt nó
import cv2
Đọc hình ảnh đầu vào dưới dạng hình ảnh thang độ xám bằng cv2. imread[]
img1 = cv2.imread['star.png',0] img2 = cv2.imread['star1.png',0]
Áp dụng ngưỡng trên các hình ảnh thang độ xám để tạo các hình ảnh nhị phân
ret,thresh1 = cv2.threshold[img1,150,255,0] ret,thresh2 = cv2.threshold[img1,150,255,0]
Tìm các đường viền của các hình dạng trong các hình ảnh nhị phân bằng cách sử dụng cv2. hàm findContours[]
contours1, _ = cv2.findContours[thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE] contours2, _ = cv2.findContours[thresh2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE]
Chọn đường viền cụ thể từ mỗi hình ảnh và áp dụng chức năng đối sánh hình dạng cv2. matchShapes[] đi qua các đường viền đã chọn
cnt1=contours1[0] cnt2=contours2[0] ret12 = cv2.matchShapes[cnt1, cnt2, 1, 0.0]
In giá trị kết quả, số liệu khớp hình ảnh. Giá trị càng thấp thì càng phù hợp
print["Matching Image 1 with Image 2:", ret12]
Hãy xem xét một số ví dụ để hiểu rõ hơn
ví dụ 1
Trong chương trình này, chúng tôi khớp hai hình ảnh. Mỗi hình ảnh chứa một hình dạng duy nhất. Chúng tôi cũng khớp hình dạng với chính nó từ mỗi hình ảnh
Hãy coi những hình ảnh dưới đây là những hình ảnh đầu vào được đề cập là 'ngôi sao. png' và 'ngũ giác. png' trong chương trình trên
đầu ra
Khi thực thi, đoạn mã trên sẽ tạo ra đầu ra sau -
Number of Shapes detected in Image 1: 1 Number of Shapes detected in Image 2: 1 Matching Image 1 with itself: 0.0 Matching Image 2 with itself: 0.0 Matching Image 1 with Image 2: 0.6015851094057714
ví dụ 2
Trong chương trình này, chúng tôi khớp các hình dạng trong hình ảnh. Chúng tôi phát hiện ba hình dạng trong hình ảnh
Chúng tôi sẽ sử dụng hình ảnh sau đây và Tệp đầu vào trong chương trình này -
đầu ra
Khi thực thi, đoạn mã trên sẽ tạo ra đầu ra sau -
________số 8Và chúng tôi nhận được cửa sổ sau, hiển thị đầu ra -
Trên cơ sở kết quả trên, chúng tôi kết luận rằng Hình dạng 1 giống với Hình dạng 2 hơn Hình dạng 3