gpt4 book ai didi

python - 使用OpenCV检测并将一幅图像中的区域替换为另一幅图像

转载 作者:行者123 更新时间:2023-12-02 16:27:37 25 4
gpt4 key购买 nike

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

第一张图片

原始图片

最佳答案

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

  • 获取二进制图像。 加载图像,灰度,Gaussian blur,然后Otsu's threshold
  • 提取ROI并替换。 使用 cv2.findContours 查找轮廓,然后使用 cv2.arcLength cv2.approxPolyDP 使用轮廓近似进行过滤。假设该区域是一个矩形,如果轮廓近似结果是4,那么我们已经找到了所需的区域。另外,我们使用 cv2.contourArea 进行过滤以确保不包含噪音。最后,我们使用 cv2.boundingRect 获得边界框坐标,并使用Numpy slice 提取ROI。最后,我们将ROI替换为原始图像。


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

    提取的ROI

    enter image description here

    结果


    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()

    关于python - 使用OpenCV检测并将一幅图像中的区域替换为另一幅图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60438194/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com