python 如何查找包含在图像中的图像?

8yparm6h  于 2023-02-11  发布在  Python
关注(0)|答案(4)|浏览(347)

我目前正在建立一个基本上相当于一个搜索引擎和网络漫画画廊之间的交叉点,专注于引用来源和给予作者信任。
我在想办法搜索图片来找出里面的人物。
例如:

假设我把红色角色和绿色角色分别保存为红人和绿人,我如何确定一个图像包含其中之一。
这不需要有100%的识别或任何东西,这是一个更多的附加功能,我想创建,我只是不知道从哪里开始。我做了很多谷歌图像识别,但没有发现太多的帮助。
不管怎样,我更愿意使用Python来完成这个任务。

x0fgdtte

x0fgdtte1#

由于Moshe's answer只涉及匹配在给定图片中只包含一次的模板。下面是一次匹配多个模板的方法:

import cv2
import numpy as np

img_rgb = cv2.imread('mario.png')
template = cv2.imread('mario_coin.png')
w, h = template.shape[:-1]

res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
threshold = .8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):  # Switch columns and rows
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)

cv2.imwrite('result.png', img_rgb)

(Note:我修改并修复了原始代码中的一些 “错误”

结果:

**来源:**https:opencv24-python-tutorials.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html#template-matching-with-multiple-objects

n53p2ov0

n53p2ov02#

对于任何在未来偶然发现这个的人。
这可以通过模板匹配来完成。总结一下(我的理解),模板匹配寻找一张图像在另一张图像中的精确匹配。
下面是一个如何在Python中实现的例子:

import cv2

method = cv2.TM_SQDIFF_NORMED

# Read the images from the file
small_image = cv2.imread('small_image.png')
large_image = cv2.imread('large_image.jpeg')

result = cv2.matchTemplate(small_image, large_image, method)

# We want the minimum squared difference
mn,_,mnLoc,_ = cv2.minMaxLoc(result)

# Draw the rectangle:
# Extract the coordinates of our best match
MPx,MPy = mnLoc

# Step 2: Get the size of the template. This is the same size as the match.
trows,tcols = small_image.shape[:2]

# Step 3: Draw the rectangle on large_image
cv2.rectangle(large_image, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2)

# Display the original image with the rectangle around the match.
cv2.imshow('output',large_image)

# The image is only displayed if we call this
cv2.waitKey(0)
xtupzzrd

xtupzzrd3#

OpenCV有一个Python接口,你可以看看。如果字符,不要改变太多,你可以尝试使用matchTemplate函数。
这是他们的官方教程(本教程是使用C++接口编写的,但您应该能够从中了解如何在Python中使用该函数)。

zbdgwd5y

zbdgwd5y4#

重要提示:matchTemplate甚至能够检测调整大小和旋转的模板。下面是代码和输出。

import matplotlib.pyplot as plt
import numpy as np
import cv2

image = cv2.imread('/content/picture.png')
template = cv2.imread('/content/penguin.png')
heat_map = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)

h, w, _ = template.shape
y, x = np.unravel_index(np.argmax(heat_map), heat_map.shape)
cv2.rectangle(image, (x,y), (x+w, y+h), (0,0,255), 5)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

图片:picture模板:penguin结果:detected
详细说明在这里(我的博客):simple-ai.net/find-and-replace-in-image

相关问题