python - 如何从图像中移除带图案的背景并检测对象?
问题描述
我有一个图像是视频的帧。正如您在原始图像中看到的那样,背景的图案使得检测乐高物体变得具有挑战性。根据我当前的代码,对象边缘被错误地检测到并与背景的形状混淆,结果出现在这张图片中。矩形的结果显示在这里。我的代码:
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)
如何正确检测对象?
解决方案
给定关于图案的足够约束(图像中的周期数范围?恒定对称组?完全重复?),您可以通过相关性找到图案的晶胞。
然后考虑堆叠瓷砖(新轴)。计算沿新轴的每个颜色通道的中值。以中值的 2D 图像为模板,将其传播回原始图像。
计算差异。巨大的差异表明乐高。
可能的细化:去除异常值(乐高),估计并最终去除由于照明/渐晕变化而导致的差异趋势。
编辑:即使只有两个瓷砖,它也能很好地工作:我可以通过控制眼睛的会聚角(不失去焦点)同时看两个瓷砖,这样我的视觉皮层就会产生相关性和错误类型检测(不匹配的部分)。乐高积木似乎弹出。
编辑2:我对你的第二张图片(边缘)进行了同样的尝试。相关性很好(锁定到正确的会聚角)并且差异集群有点明显,但是没有颜色和低频信息,没有对象弹出。
因此,边缘检测不应该是第一步,除了可能增加处理透视和失真的精度。模式周期和畸变场的同时估计是拼接中解决的问题。对于您的问题(固定相机位置、固定焦点和变焦设置),可能不需要同时执行此操作。
推荐阅读
- opencv - Matrox 成像库中的 MdigGrab 是提供彩色图像还是黑白图像
- python - 必要时在字符串中插入乘法运算符
- javascript - 在我接受用户的回答之前,如何在控制台上显示我的问题?
- c# - C#如何从特定单元格datagridview中获取值
- assembly - 如何在emu8086中创建和绘制精灵?
- angular - 角度错误:http://localhost:3000/login: 404 Not Found 的 Http 失败响应
- c++ - 当您指定 /MT 时,静态库是否包含 CRT,还是仅适用于 DLL?
- regex - 匹配 Perl 6 分隔注释的 Perl 6 正则表达式
- php - PHP Image:生成的图像在生产服务器上有右下角黑色边框,但在我的本地机器上没有
- javascript - JavaScript函数执行面临的问题