Python 使用OpenCV检测并替换图像中的区域

Python 使用OpenCV检测并替换图像中的区域,python,image,opencv,image-processing,computer-vision,Python,Image,Opencv,Image Processing,Computer Vision,我有两张相同尺寸的图片,我想在第二张图片的相同位置检测并替换第一张图片中的白色区域(黑色图像)。使用OpenCV有什么方法可以做到这一点吗?我想用第一张图片中的白色区域替换原始图像中的蓝色区域 第一张照片 原始图像 如果我理解正确,您希望将黑色图像上的白色ROI替换为原始图像。这里有一个简单的方法: 获取二值图像。加载图像、灰度,然后 提取ROI并替换。使用和查找轮廓,然后使用轮廓近似进行过滤。假设该区域为矩形,如果轮廓近似结果为4,则我们已找到所需区域。此外,我们使用过滤器来确保不包含噪声。

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

第一张照片

原始图像


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

  • 获取二值图像。加载图像、灰度,然后

  • 提取ROI并替换。使用和查找轮廓,然后使用轮廓近似进行过滤。假设该区域为矩形,如果轮廓近似结果为
    4
    ,则我们已找到所需区域。此外,我们使用过滤器来确保不包含噪声。最后,我们使用Numpy切片获得边界框坐标并提取ROI。最后,我们将ROI替换为原始图像


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

    提取的ROI

    结果

    代码


    谢谢我感谢你的帮助!我希望做一些类似的事情,除了在多个图像中用另一个圆形徽标替换一个圆形徽标。如果区域是圆形而不是矩形,则代码是否相同?否,您必须调整轮廓近似值,在这个特定示例中,它的
    4
    ,因为这是矩形或圆形。如果你想找到一个圆形标志,把它改成9+之类的
    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()