Python 如何识别与查询图像模板匹配的图像中不同颜色的对象?

Python 如何识别与查询图像模板匹配的图像中不同颜色的对象?,python,opencv,image-processing,object-detection,template-matching,Python,Opencv,Image Processing,Object Detection,Template Matching,我有一面美国国旗,上面有星星,还有一张面具图片,上面有一颗黑色的星星。使用遮罩图像,我想探测美国国旗上的所有星星,尽管颜色不同。当我使用上面的代码时,我只能识别标记为白色的星星,如下图所示 红色的盒子下面有一颗黑色的星星,与遮罩图像中的星星相匹配。我猜这是因为我用灰色图像来识别这些恒星。如下图所示,彩色星星在变灰过程中褪色,算法无法将其与背景色区分开来 原始图像发布如下: 遮罩: 美国国旗: 通常,我在HSV颜色空间中处理带有颜色信息的图像。我分析了RGB和HSV中的不同通道,发现V通道最

我有一面美国国旗,上面有星星,还有一张面具图片,上面有一颗黑色的星星。使用遮罩图像,我想探测美国国旗上的所有星星,尽管颜色不同。当我使用上面的代码时,我只能识别标记为白色的星星,如下图所示

红色的盒子下面有一颗黑色的星星,与遮罩图像中的星星相匹配。我猜这是因为我用灰色图像来识别这些恒星。如下图所示,彩色星星在变灰过程中褪色,算法无法将其与背景色区分开来

原始图像发布如下:

  • 遮罩:
  • 美国国旗:

通常,我在
HSV
颜色空间中处理带有颜色信息的图像。我分析了
RGB
HSV
中的不同通道,发现
V
通道最适合这个问题

BGR

HSV

然后进行模板匹配,我得到以下结果:



我想也许使用
findContours
也可以完成这项工作。

您能不能也发布原始输入图像?(<代码> uSavigual.PNG < /C>和<代码> Mask.PNG < /代码>),因为它是区分对象的颜色,我将考虑使用HSV或HSI颜色空间,而不是仅仅使用RGB图像的灰度版本。现在,DANMA MyEK增加了。为了检测图像中的星星,<代码> V(HSV)。比
灰色
好。请告诉我如何控制边界框的厚度。我尝试了以下代码,得到了与星星重叠的非常厚的边界框。请让我知道如何复制您的输出框的厚度。对于zip中的pt(*loc[:-1]):cv2.矩形(图像,pt,(pt[0]+w,pt[1]+h),(0,0255),1,8)如果您检查阈值
cv2.minMaxLoc
结果找到的
loc
,您将发现每个区域中都有多个pt。我将比率调整为
0.9
,这样pts变小,盒子看起来更薄(但直到每个星星都有一个盒子),所以你无法真正控制每个星星盒子的厚度。正如我所说的,
findContours
会更有效,因为它每颗星只能找到一个轮廓。
import numpy as np
import cv2
import os

dir = 'C:\\Project\\Interview Packet'
os.chdir(dir)

image = cv2.imread('us_flag_color.png')
template = cv2.imread('mask.png')

imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

template = cv2.Canny(template, 50, 200)

result = cv2.matchTemplate(imageGray, templateGray, cv2.TM_SQDIFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

w, h = template.shape[:2]
threshold = 0.8*max_val
loc = np.where( result >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

cv2.imwrite("res.png", image)