您可以尝试通过将图像转换为 HSV 颜色空间来过滤掉您的圈子 - cv2.COLOR_BGR2HSV。然后您可以使用 cv2.inRange() 搜索您的颜色并将它们绘制在蒙版上(每种颜色都使用不同的蒙版)
类似这样的:
过滤掉圆圈后,您可以使用cv2.findContours() 搜索轮廓并找到它的位置(您可以搜索它的中心点或极值点),以确定您应该在图像上放置较小图像的位置。请注意,我已经手动调整了您的较小图像,如果您想拥有同一张图片的不同尺寸,您将不得不修改代码。此外,如果您想保持透明度,您应该使用图像的通道并更改代码。这只是我将如何处理任务的一个示例。
示例代码(不透明,图片大小相同):
import cv2
import numpy as np
img = cv2.imread('thermal2.png')
dog = cv2.imread('resize1.jpg')
donkey = cv2.imread('resize2.jpg')
monkey = cv2.imread('resize3.png')
resize1 = cv2.resize(dog, (35, 40))
resize2 = cv2.resize(donkey, (60, 35))
resize3 = cv2.resize(monkey, (40, 40))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
lower_red = np.array([0,50,50])
upper_red = np.array([10,255,255])
lower_yellow = np.array([30,50,50])
upper_yellow = np.array([50,255,255])
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_red = cv2.inRange(hsv, lower_red, upper_red)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)
res_blue = cv2.bitwise_and(img,img, mask=mask_blue)
res_red = cv2.bitwise_and(img,img, mask=mask_red)
res_yellow = cv2.bitwise_and(img,img, mask=mask_yellow)
gray_blue = cv2.cvtColor(res_blue, cv2.COLOR_BGR2GRAY)
gray_red = cv2.cvtColor(res_red, cv2.COLOR_BGR2GRAY)
gray_yellow = cv2.cvtColor(res_yellow, cv2.COLOR_BGR2GRAY)
_,thresh_blue = cv2.threshold(gray_blue,10,255,cv2.THRESH_BINARY)
_,thresh_red = cv2.threshold(gray_red,10,255,cv2.THRESH_BINARY)
_,thresh_yellow = cv2.threshold(gray_yellow,10,255,cv2.THRESH_BINARY)
_, contours_blue, hierarhy1 = cv2.findContours(thresh_blue,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
_, contours_red, hierarhy2 = cv2.findContours(thresh_red,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
_, contours_yellow, hierarhy3 = cv2.findContours(thresh_yellow,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for c in contours_red:
size = cv2.contourArea(c)
if size > 30:
cXY_left = tuple(c[c[:, :, 0].argmin()][0])
cXY_top = tuple(c[c[:, :, 1].argmin()][0])
cX = cXY_left[0]
cY = cXY_top[1]
img[cY:cY+resize1.shape[0], cX:cX+resize1.shape[1]]=resize1
for c in contours_blue:
size = cv2.contourArea(c)
if size > 30:
cXY_left = tuple(c[c[:, :, 0].argmin()][0])
cXY_top = tuple(c[c[:, :, 1].argmin()][0])
cX = cXY_left[0]
cY = cXY_top[1]
img[cY:cY+resize2.shape[0], cX:cX+resize2.shape[1]]=resize2
for c in contours_yellow:
size = cv2.contourArea(c)
if size > 30:
cXY_left = tuple(c[c[:, :, 0].argmin()][0])
cXY_top = tuple(c[c[:, :, 1].argmin()][0])
cX = cXY_left[0]
cY = cXY_top[1]
img[cY:cY+resize3.shape[0], cX:cX+resize3.shape[1]]=resize3
cv2.imshow('blue', res_blue)
cv2.imshow('red', res_red)
cv2.imshow('yellow', res_yellow)
cv2.imshow('img',img)
结果: