首页 > 解决方案 > 如何从图像中移除带图案的背景并检测对象?

问题描述

我有一个图像是视频的帧。正如您在原始图像中看到的那样,背景的图案使得检测乐高物体变得具有挑战性。根据我当前的代码,对象边缘被错误地检测到并与背景的形状混淆,结果出现在这张图片中。矩形的结果显示在这里。我的代码:

import cv2
import numpy as np

main_image = cv2.imread('image.jpg', 1)
convert_to_gray = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
convert_to_blurred = cv2.GaussianBlur(convert_to_gray, (3, 3), 2)
a, b = cv2.threshold(convert_to_blurred, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
canny_result = cv2.Canny(convert_to_blurred, a / 6, b / 3)
k = np.ones((2, 2), np.uint8)
d = cv2.dilate(canny_result, k, iterations=3)

contours_found = cv2.findContours(d, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours_found = contours_found[0] if len(contours_found) == 2 else contours_found[1]

for cont in contours_found:
    x, y, w, h = cv2.boundingRect(cont)
    cv2.rectangle(main_image, (x, y), (x + w, y + h), (0, 0, 255), 3)

cv2.imshow('canny_result', canny_result)
cv2.imshow('main_image', main_image)
cv2.waitKey(0)

如何正确检测对象?

标签: pythonpython-3.ximage-processing

解决方案


给定关于图案的足够约束(图像中的周期数范围?恒定对称组?完全重复?),您可以通过相关性找到图案的晶胞。

然后考虑堆叠瓷砖(新轴)。计算沿新轴的每个颜色通道的中值。以中值的 2D 图像为模板,将其传播回原始图像。

计算差异。巨大的差异表明乐高。

可能的细化:去除异常值(乐高),估计并最终去除由于照明/渐晕变化而导致的差异趋势。

编辑:即使只有两个瓷砖,它也能很好地工作:我可以通过控制眼睛的会聚角(不失去焦点)同时看两个瓷砖,这样我的视觉皮层就会产生相关性和错误类型检测(不匹配的部分)。乐高积木似乎弹出。

编辑2:我对你的第二张图片(边缘)进行了同样的尝试。相关性很好(锁定到正确的会聚角)并且差异集群有点明显,但是没有颜色和低频信息,没有对象弹出。

因此,边缘检测不应该是第一步,除了可能增加处理透视失真的精度。模式周期和畸变场的同时估计是拼接中解决的问题。对于您的问题(固定相机位置、固定焦点和变焦设置),可能不需要同时执行此操作。


推荐阅读