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

原始图像

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

原始图像

如果我对您的理解正确,您想将黑色图像上的白色 ROI 替换为原始图像。这是一个简单的方法:
提取 ROI 并替换。使用和cv2.findContours使用轮廓近似查找轮廓然后过滤。假设该区域是一个矩形,如果轮廓近似结果是,那么我们已经找到了我们想要的区域。此外,我们过滤使用以确保我们不包含噪音。最后,我们使用 Numpy 切片获得边界框坐标并提取 ROI。最后我们将 ROI 替换为原始图像。 cv2.arcLengthcv2.approxPolyDP4cv2.contourAreacv2.boundingRect
检测到要提取/替换的区域以绿色突出显示

提取的投资回报率
结果

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