代码之家  ›  专栏  ›  技术社区  ›  plpm

如何从图像中删除有图案的背景?

  •  0
  • plpm  · 技术社区  · 3 年前

    我有一张图片,是一帧视频。如您所见 original image 背景具有一种模式,使得检测乐高物体变得具有挑战性。根据我目前的代码,对象边缘被错误地检测到,并与背景的形状混淆,结果是 this image 。结果显示为矩形 here .我的代码:

    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)
    
    

    如何正确检测物体?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Rainald62    3 年前

    如果对模式有足够的约束(图像中的周期数范围?恒定对称群?完全重复?),您可能能够通过相关性找到模式的晶胞。

    然后考虑堆叠瓷砖(新轴)。计算沿新轴的每个颜色通道的中值。以中值的二维图像为模板,将其展开到原始图像上。

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

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

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

    编辑2: 我对你的第二张图片(边缘)也做了同样的尝试。相关性工作良好(锁定在正确的会聚角),差异集群有点明显,但没有颜色和低频信息,就没有物体弹出。

    因此,边缘检测不应是第一步,除非是为了提高应对的精度 perspective distortion 模式周期和失真场的并发估计是在 stitching 。对于您的问题(固定的相机位置、固定的焦距和变焦设置),可能不需要同时进行。