【问题标题】:How to recognize different-colored objects in an image matching the template of the query image?如何识别与查询图像模板匹配的图像中的不同颜色对象?
【发布时间】:2017-12-11 19:12:24
【问题描述】:
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)

我有一面带有星星的美国国旗和一个由黑色星星组成的蒙版图像。使用蒙版图像,我想检测美国国旗中的所有星星,尽管颜色不同。当我使用上面的代码时,我只能识别标记为白色的星星,如下图所示。

红色的盒子下面有一个黑色的星星,与蒙版图像中的星星相匹配。我猜这是因为我使用灰色图像来识别这些星星。如下图,彩色星星在变灰的过程中会变淡,算法无法将其与背景颜色区分开来。

原图如下:

  • 掩码:
  • 美国国旗:

【问题讨论】:

  • 能否请您也发布原始输入图像? (us_flag_color.pngmask.png
  • 因为区分对象的是颜色,所以我会考虑使用 HSV 或 HSI 色彩空间,而不仅仅是 RGB 图像的灰度版本。
  • @DanMašek 现已添加。
  • 为了检测这张图片中的星星,V(HSV)gray 好。

标签: python opencv image-processing object-detection template-matching


【解决方案1】:

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

BGR:

HSV:

然后做模板匹配,我明白了:


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

【讨论】:

  • 你能告诉我如何控制边界框的厚度。我尝试了以下代码,我得到了与星星重叠的非常厚的边界框。请让我知道如何在您的输出中重现盒子的厚度。对于 pt in zip(*loc[::-1]): cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,0,255), 1, 8)
  • 如果你检查阈值cv2.minMaxLoc结果找到的loc,你会发现每个区域都有不止一个pts。而且我将比例调整为0.9,因此pts变少了,盒子看起来更薄了(但每颗星星都不止一个盒子),所以你无法真正控制每颗星星的盒子的厚度。正如我所说,findContours 会更好,因为它只能找到每颗星的一个轮廓。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2021-04-12
  • 2019-11-17
  • 2020-07-02
  • 2023-03-18
相关资源
最近更新 更多