【问题标题】:Detect and replace region from one image onto another image with OpenCV使用 OpenCV 检测并替换从一张图像到另一张图像的区域
【发布时间】:2020-02-28 07:56:18
【问题描述】:

我有两张相同尺寸的图片,我想在第二张图片的相同位置检测并替换第一张图片(黑色图片)中的白色区域。有没有办法使用OpenCV 做到这一点?我想用第一张图片中的白色区域替换原始图像中的蓝色区域。

第一张照片

原图

【问题讨论】:

    标签: python image opencv image-processing computer-vision


    【解决方案1】:

    如果我对您的理解正确,您希望将黑色图像上的白色 ROI 替换为原始图像。这是一个简单的方法:

    1. 获取二值图像。加载图像,灰度,Gaussian blur,然后Otsu's threshold

    2. 提取 ROI 并替换。 使用 cv2.findContours 查找轮廓,然后使用 cv2.arcLengthcv2.approxPolyDP 使用轮廓近似进行过滤。假设该区域是一个矩形,如果轮廓近似结果是4,那么我们已经找到了我们想要的区域。此外,我们使用cv2.contourArea 进行过滤,以确保我们不包含噪音。最后,我们使用cv2.boundingRect 获得边界框坐标,并使用 Numpy 切片提取 ROI。最后我们将 ROI 替换为原始图像。


    检测到的要提取/替换的区域以绿色突出显示

    提取的投资回报率

    结果

    代码

    import cv2
    
    # Load images, grayscale, Gaussian blur, Otsu's threshold
    original = cv2.imread('1.jpg')
    image = cv2.imread('2.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (3,3), 0)
    thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    
    # Find contours, filter using contour approximation + area, then extract
    # ROI using Numpy slicing and replace into original image
    cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.015 * peri, True)
        area = cv2.contourArea(c)
        if len(approx) == 4 and area > 1000:
            x,y,w,h = cv2.boundingRect(c)
            ROI = image[y:y+h,x:x+w]
            original[y:y+h, x:x+w] = ROI
    
    cv2.imshow('thresh', thresh)
    cv2.imshow('ROI', ROI)
    cv2.imshow('original', original)
    cv2.waitKey()
    

    【讨论】:

    • 谢谢!感谢您的帮助!
    • 我想做类似的事情,除了我用多个图像中的另一个圆形徽标替换一个圆形徽标。如果区域是圆形而不是矩形,代码是否相同?
    • 不,您必须调整轮廓近似值,在此特定示例中为4,因为这是针对矩形或圆形的。如果你想找到一个圆形的标志,把它改成 9+ 之类的
    猜你喜欢
    • 2013-12-20
    • 2017-06-28
    • 1970-01-01
    • 2013-12-08
    • 2022-07-01
    • 2016-11-23
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多