Khớp hình ảnh opencv python

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ố 8

Và 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

Làm cách nào để khớp một hình ảnh được nhúng trong một hình ảnh khác trong Python bằng OpenCV?

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.

Mẫu đối sánh hoạt động như thế nào trong OpenCV?

Tính năng khớp mẫu hoạt động như thế nào? .
Hình ảnh mẫu chỉ cần trượt trên hình ảnh đầu vào [như trong tích chập 2D]
Mẫu và bản vá của hình ảnh đầu vào bên dưới hình ảnh mẫu được so sánh
Kết quả thu được được so sánh với ngưỡng

Đầu ra của cv2 matchTemplate là gì?

Kết quả đầu ra từ cv2. matchTemplate là ma trận có kích thước không gian. Chiều rộng. hình ảnh. hình dạng[1] - mẫu .

Làm cách nào để phát hiện đối tượng trong ảnh bằng OpenCV?

Nhận dạng hoặc phát hiện đối tượng trong hình ảnh .
# Nhập mô-đun OpenCV
nhập cv2
# Nhập pyplot từ matplotlib dưới dạng plt
từ matplotlib nhập pyplot dưới dạng pltd
# Mở hình ảnh từ tập tin
hình ảnh = cv2. imread["opencv-od. png"]
# Thay đổi thuộc tính của hình ảnh với cv2
image_gray = cv2. cvtColor[hình ảnh, cv2

Chủ Đề